SAGE is not meant to be validated only with stubs. We use two layers:
| Layer | What it is | When |
|---|---|---|
| Unit + mocked e2e | Fast, no Ollama, no network | Every PR (ci.yml tests job) |
| Live | Real Ollama, real chat_with_timeout, real PlannerAgent, real CLI subprocesses |
Required before tagging a release; runs in CI (live job) |
tests/e2e/test_greenfield_pipeline_mocked.py— mocks agents to exercise the LangGraph wiring without a model. Does not replace live tests.
Requires Ollama installed and on PATH, and a small model pulled (the script pulls qwen2.5-coder:1.5b).
chmod +x scripts/live_verify.sh
./scripts/live_verify.shThis runs:
pytest tests/integration -m ollama— real planner + real chat testssage eval smoke— same integration tests via the CLI entrypoint
Set SAGE_MODEL_PROFILE=test for a single small model everywhere during these runs (CI does the same).
Workflow .github/workflows/ci.yml includes a live job (after unit tests pass) that installs Ollama, pulls qwen2.5-coder:1.5b, and runs the live pytest target.
If the live job fails, treat it as release-blocking for anything that claims “full stack works.”
- Everything in one pytest file: not realistic — bench, sim, RL, and full
sage runend-to-end are separate entrypoints (verify_local.shcovers many of those without Ollama). - Full stack for agents: live job +
verify_local.shtogether cover CLI + Ollama + planner + optional RL/sim paths.
See also docs/TRUST_AND_SCALE.md and CONTRIBUTING.md.