# Optional Windows CI when PR label `ci:windows` is present. # Separate workflow + concurrency group so Windows label runs are isolated. name: CI Labels (Windows) on: pull_request: branches: [main] types: [opened, synchronize, reopened, labeled, unlabeled] permissions: contents: read env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" # Keep in sync with ci.yml — single source of truth for lint/typecheck/coverage targets. PYTHON_SOURCE_PATHS: "config core integrations platform surfaces tools" concurrency: group: ci-labels-windows-${{ github.ref }} cancel-in-progress: true jobs: windows-quality: if: contains(github.event.pull_request.labels.*.name, 'ci:windows') name: windows quality runs-on: windows-latest timeout-minutes: 15 continue-on-error: true 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: Lint run: uv run python -m ruff check ${{ env.PYTHON_SOURCE_PATHS }} tests/ - name: Format check run: uv run python -m ruff format --check ${{ env.PYTHON_SOURCE_PATHS }} tests/ - name: Typecheck run: uv run python -m mypy ${{ env.PYTHON_SOURCE_PATHS }} windows-test: if: contains(github.event.pull_request.labels.*.name, 'ci:windows') name: windows test needs: [windows-quality] runs-on: windows-latest timeout-minutes: 25 continue-on-error: true env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} JWT_TOKEN: ${{ secrets.JWT_TOKEN }} TRACER_ORG_ID: ${{ secrets.TRACER_ORG_ID }} TRACER_WEB_APP_URL: ${{ secrets.TRACER_WEB_APP_URL }} GRAFANA_READ_TOKEN: ${{ secrets.GRAFANA_READ_TOKEN }} GCLOUD_HOSTED_METRICS_ID: ${{ secrets.GCLOUD_HOSTED_METRICS_ID }} GCLOUD_HOSTED_METRICS_URL: ${{ secrets.GCLOUD_HOSTED_METRICS_URL }} GCLOUD_HOSTED_LOGS_ID: ${{ secrets.GCLOUD_HOSTED_LOGS_ID }} GCLOUD_HOSTED_LOGS_URL: ${{ secrets.GCLOUD_HOSTED_LOGS_URL }} GCLOUD_RW_API_KEY: ${{ secrets.GCLOUD_RW_API_KEY }} GCLOUD_OTLP_ENDPOINT: ${{ secrets.GCLOUD_OTLP_ENDPOINT }} GCLOUD_OTLP_AUTH_HEADER: ${{ secrets.GCLOUD_OTLP_AUTH_HEADER }} PYTHONUTF8: "1" 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 full tests run: >- uv run python -m pytest -n auto -v --cov=config --cov=core --cov=platform.deployment.aws --cov=platform.deployment --cov=integrations --cov=platform --cov=surfaces --cov=tools --cov-report=term-missing --cov-report=html --ignore=tests/e2e/kubernetes_local_alert_simulation --ignore=tests/synthetic -m "not synthetic and not integration"