name: bench-advisory # SDD-120 §6 / SRS-218 — advisory-only realtime-audio bench workflow. # Runs the criterion bench harness on PR + tag events, compares the # current results against the SAD-089 baseline JSON resolved at the # merge-base, and renders a markdown report posted (or updated) as a # single sticky PR comment. The job status is ALWAYS success — this # workflow never fails a check on regression (SRS-218 clause 4). on: pull_request: types: [opened, synchronize, reopened] push: tags: ["**"] permissions: pull-requests: write contents: read jobs: bench-advisory: name: bench-advisory runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: System deps (cpal / Opus / SDL2) run: | sudo apt-get update sudo apt-get install -y \ libasound2-dev libpulse-dev pkg-config \ libdbus-1-dev \ libsdl2-dev \ libopus-dev - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 - name: Run benchmarks run: | if ! cargo bench -p chanora_audio \ --bench realtime_capture \ --bench opus_codec \ --bench resampler; then echo "::warning::Benchmark harness failed; continuing advisory workflow per SRS-218 clause 4" fi - name: Emit current baseline JSON run: cargo run --example emit_baseline -p chanora_audio - name: Resolve merge-base baseline run: | DEFAULT_BRANCH="${{ github.event.repository.default_branch }}" if [ "${{ github.event_name }}" = "pull_request" ]; then BASE_SHA="${{ github.event.pull_request.base.sha }}" MERGE_BASE=$(git merge-base "$BASE_SHA" HEAD || true) else MERGE_BASE=$(git merge-base "origin/${DEFAULT_BRANCH}" HEAD || true) fi if [ -n "$MERGE_BASE" ] && git show "${MERGE_BASE}:crates/chanora_audio/benches/baselines/x86_64-unknown-linux-gnu.json" > baseline.json 2>/dev/null; then echo "BASELINE_FOUND=1" >> "$GITHUB_ENV" else echo "BASELINE_FOUND=0" >> "$GITHUB_ENV" echo "{}" > baseline.json fi - name: Compare against baseline run: | cargo run --example compare_baseline -p chanora_audio -- \ --current current.json \ --baseline baseline.json \ --output report.md - name: Post PR comment if: github.event_name == 'pull_request' uses: actions/github-script@v7 with: script: | const fs = require('fs'); const body = fs.readFileSync('report.md', 'utf8'); const marker = ''; const { data: comments } = await github.rest.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, }); const existing = comments.find(c => c.body && c.body.startsWith(marker)); if (existing) { await github.rest.issues.updateComment({ owner: context.repo.owner, repo: context.repo.repo, comment_id: existing.id, body, }); } else { await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, body, }); } - name: Upload report artifact (push events) if: github.event_name == 'push' uses: actions/upload-artifact@v4 with: name: bench-report path: report.md