Spaces:
Running
Running
| """ | |
| echo/test_age_invariant.py | |
| -------------------------- | |
| Regression guard for the age invariant: across the whole tree, a child's age | |
| must equal parent.age + years_elapsed, and the root must keep its base_age. | |
| Age is arithmetic, not generation — the model's free-form `age` must never be | |
| able to break the tree's math. Runs on MockLLM (no GPU, no ML deps). | |
| python -m echo.test_age_invariant | |
| """ | |
| from __future__ import annotations | |
| from echo.core.orchestrator import Orchestrator | |
| from echo.llm.client import MockLLM | |
| from echo.tools.research import MockResearch | |
| from echo.tools.voice import MockVoice | |
| def _orch() -> Orchestrator: | |
| return Orchestrator(MockLLM(seed=0), MockResearch(), MockVoice()) | |
| def test_root_keeps_base_age() -> None: | |
| root = _orch().seed("I stayed in Brazil instead of moving abroad", base_age=22) | |
| assert root.facts.age == 22, f"root age {root.facts.age} != base_age 22 (Bug 3)" | |
| def test_child_age_is_parent_plus_years() -> None: | |
| orch = _orch() | |
| root = orch.seed("I stayed in Brazil instead of moving abroad", base_age=22) | |
| child = orch.choose_fork(root.node_id, 0, years=5) | |
| assert child.years_elapsed == 5, f"years_elapsed {child.years_elapsed} != 5" | |
| expected = root.facts.age + 5 | |
| assert child.facts.age == expected, \ | |
| f"child age {child.facts.age} != expected {expected} (Bug 1)" | |
| def test_age_invariant_holds_down_a_branch() -> None: | |
| """Grow three generations and assert age math at every edge.""" | |
| orch = _orch() | |
| node = orch.seed("I stayed in Brazil instead of moving abroad", base_age=30) | |
| for _ in range(3): | |
| parent = node | |
| node = orch.choose_fork(parent.node_id, 0, years=7) | |
| expected = parent.facts.age + 7 | |
| assert node.facts.age == expected, \ | |
| f"depth {node.depth}: age {node.facts.age} != expected {expected}" | |
| def main() -> int: | |
| tests = [ | |
| test_root_keeps_base_age, | |
| test_child_age_is_parent_plus_years, | |
| test_age_invariant_holds_down_a_branch, | |
| ] | |
| failed = 0 | |
| for t in tests: | |
| try: | |
| t() | |
| print(f" PASS {t.__name__}") | |
| except AssertionError as e: | |
| failed += 1 | |
| print(f" FAIL {t.__name__}: {e}") | |
| print("=" * 50) | |
| if failed: | |
| print(f"{failed}/{len(tests)} FAILED") | |
| return 1 | |
| print(f"ALL {len(tests)} PASSED ✓") | |
| return 0 | |
| if __name__ == "__main__": | |
| raise SystemExit(main()) | |