feat: add expert-panel ensemble with dynamic confidence weighting #1448
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| pull_request: | |
| branches: [main] | |
| concurrency: | |
| group: ci-${{ github.event.pull_request.number || github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| changes: | |
| name: 🔎 Change Detection | |
| runs-on: ubuntu-latest | |
| outputs: | |
| frontend: ${{ steps.filter.outputs.frontend }} | |
| steps: | |
| - name: 📥 Checkout | |
| uses: actions/checkout@v5 | |
| - name: 🧭 Filter paths | |
| id: filter | |
| uses: dorny/paths-filter@v3 | |
| with: | |
| filters: | | |
| frontend: | |
| - 'apps/dsa-web/**' | |
| ai-governance: | |
| name: ai-governance | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: 📥 Checkout | |
| uses: actions/checkout@v5 | |
| - name: 🐍 Setup Python | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.11' | |
| - name: 🤖 Check AI governance assets | |
| run: python scripts/check_ai_assets.py | |
| backend-gate: | |
| name: backend-gate | |
| runs-on: ubuntu-latest | |
| needs: [ai-governance] | |
| steps: | |
| - name: 📥 Checkout | |
| uses: actions/checkout@v5 | |
| - name: 🐍 Setup Python | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.11' | |
| cache: 'pip' | |
| cache-dependency-path: | | |
| requirements.txt | |
| requirements-ci.txt | |
| - name: 📦 Install dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| for attempt in 1 2 3; do | |
| if python -m pip install -r requirements-ci.txt; then | |
| break | |
| fi | |
| if [ "$attempt" -eq 3 ]; then | |
| echo "Dependency install failed after ${attempt} attempts." >&2 | |
| exit 1 | |
| fi | |
| echo "Dependency install attempt ${attempt} failed, retrying in 15s..." >&2 | |
| sleep 15 | |
| done | |
| - name: ✅ Python syntax check | |
| run: ./scripts/ci_gate.sh syntax | |
| - name: ✅ Flake8 critical checks | |
| run: ./scripts/ci_gate.sh flake8 | |
| - name: ✅ Local deterministic checks | |
| run: ./scripts/ci_gate.sh deterministic | |
| - name: ✅ Offline test suite | |
| run: ./scripts/ci_gate.sh offline-tests | |
| docker-build: | |
| name: docker-build | |
| runs-on: ubuntu-latest | |
| needs: [backend-gate] | |
| steps: | |
| - name: 📥 Checkout | |
| uses: actions/checkout@v5 | |
| - name: 🐳 Build image | |
| run: | | |
| docker build -t stock-analysis:test -f docker/Dockerfile . | |
| docker run --rm stock-analysis:test python -c "print('✅ Docker OK')" | |
| - name: 🔍 Docker smoke imports | |
| run: | | |
| docker run --rm stock-analysis:test python -c " | |
| from src.config import get_config; print('✅ config') | |
| from src.storage import DatabaseManager; print('✅ storage') | |
| from src.notification import NotificationService; print('✅ notification') | |
| from data_provider import DataFetcherManager; print('✅ data_provider') | |
| from src.analyzer import GeminiAnalyzer; print('✅ analyzer') | |
| from patch.eastmoney_patch import eastmoney_patch; print('✅ patch') | |
| from bot.dispatcher import CommandDispatcher; print('✅ bot') | |
| from api.app import app; print('✅ api') | |
| print('✅ All Docker imports OK') | |
| " | |
| web-gate: | |
| name: web-gate | |
| runs-on: ubuntu-latest | |
| needs: [changes, ai-governance] | |
| if: needs.changes.outputs.frontend == 'true' | |
| defaults: | |
| run: | |
| working-directory: apps/dsa-web | |
| steps: | |
| - name: 📥 Checkout | |
| uses: actions/checkout@v5 | |
| - name: 🟢 Setup Node | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: '20' | |
| cache: 'npm' | |
| cache-dependency-path: apps/dsa-web/package-lock.json | |
| - name: 📦 Install | |
| run: npm ci | |
| - name: 🔎 Lint | |
| run: npm run lint | |
| - name: 🏗️ Build | |
| run: npm run build |