name: Synthetic Deterministic Tests # Regression guardrail: run every offline (no-LLM) synthetic test on every # PR and merge so pipeline refactors can't silently break investigations. # # Tests that need a live LLM are excluded via the marker filter below. # Those suites live in interactive-shell-live.yml and hermes-tests.yml instead. on: push: branches: [main] paths: - "surfaces/**" - "config/**" - "core/**" - "integrations/**" - "platform/**" - "tools/**" - "tests/synthetic/**" - "pyproject.toml" - "uv.lock" - "pytest.ini" - ".github/workflows/synthetic-deterministic.yml" pull_request: branches: [main] paths: - "surfaces/**" - "config/**" - "core/**" - "integrations/**" - "platform/**" - "tools/**" - "tests/synthetic/**" - "pyproject.toml" - "uv.lock" - "pytest.ini" - ".github/workflows/synthetic-deterministic.yml" workflow_dispatch: permissions: contents: read concurrency: group: synthetic-det-${{ github.ref }} cancel-in-progress: true jobs: offline: name: Synthetic offline (deterministic) runs-on: ubuntu-latest timeout-minutes: 20 steps: - uses: actions/checkout@v5 - name: Install uv uses: astral-sh/setup-uv@v8.1.0 with: enable-cache: true cache-dependency-glob: | pyproject.toml uv.lock - name: Set up Python uses: actions/setup-python@v6 with: python-version: "3.13" - name: Install dependencies run: uv sync --frozen --extra dev - name: Run deterministic synthetic tests # Excludes markers that require a live LLM: # synthetic — full RCA scenario suites (EKS, RDS, Hermes, Dagster …) # axis2 — adversarial scenario suites (also call the LLM) # live_llm — explicit live-credential gate # e2e — requires live infrastructure run: | uv run pytest tests/synthetic \ -m "not synthetic and not live_llm and not e2e and not axis2" \ -q - name: Run hermes_rca offline scenario suite run: uv run python -m tests.synthetic.hermes_rca.run_suite --offline-only