name: Nightly Soak

on:
  schedule:
    - cron: "0 8 * * *"
  workflow_dispatch:

concurrency:
  group: nightly-soak-${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: false

jobs:
  soak:
    runs-on: ubuntu-latest
    timeout-minutes: 45
    steps:
      - name: Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: Set up Python
        uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
        with:
          python-version: "3.12"

      - name: Install uv
        uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1

      - name: Sync dependencies
        run: uv sync --extra dev

      - name: Soak subset
        run: ./scripts/run_soak_profile.py --profile fast --repeat 1 --output .artifacts/quality/soak-profile-fast.json

      - name: Trend gate
        run: |
          ./scripts/check_quality_trends.py \
            --soak-artifact .artifacts/quality/soak-profile-fast.json \
            --fault-artifact .artifacts/quality/fault-campaign-quick-repeat1.json \
            --baseline config/quality-trend-baselines.json \
            --output .artifacts/quality/quality-trend-gate.json

      - name: Nightly memory maintenance
        run: |
          uv run python scripts/run_memory_maintenance.py \
            --scan-limit 600 \
            --vacuum \
            --output .artifacts/quality/memory-maintenance.json

      - name: Upload soak artifacts
        if: always()
        uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
        with:
          name: nightly-soak-${{ github.run_id }}
          path: .artifacts/quality
          if-no-files-found: warn
