from pathlib import Path from aether_ad.core.context import load_context from aether_ad.core.engine import GenesisEngine from aether_ad.core.genome import load_genome ROOT = Path(__file__).resolve().parent.parent def test_e2e_no_llm(): """End-to-end with no LLM backend (template fallbacks) should still produce seeds.""" product = load_genome(ROOT / "aether_ad" / "data" / "products" / "watch_a.json") context = load_context(ROOT / "aether_ad" / "data" / "tensions" / "default_tensions.json") engine = GenesisEngine( llm=None, context=context, seed_count_per_run=6, keep_top_k=3, rng_seed=7, ) scored = engine.generate( product=product, tension_id="T01_first_challenge_first_success", persona_text="첫 출근하는 25세 신입사원, 두근거림", duration=15, ) assert len(scored) == 3 for s in scored: assert s.seed.beats, "every seed must have beats" assert 0.0 <= s.score.final <= 1.0 assert max(s.score.final for s in scored) > 0.0