test: add deterministic LBFGS coverage tests for MaxIterations and St… #1609
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 | ||
|
Check failure on line 1 in .github/workflows/ci.yml
|
||
| on: | ||
| push: | ||
| branches: [main] | ||
| pull_request: | ||
| branches: [main] | ||
| env: | ||
| CARGO_TERM_COLOR: always | ||
| RUSTFLAGS: -Dwarnings | ||
| jobs: | ||
| # Fast sanity check - catches common mistakes | ||
| makefile-lint: | ||
| name: Makefile Lint | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - name: Verify coverage target has --all-features | ||
| run: | | ||
| if ! grep -q "llvm-cov.*nextest.*--all-features" Makefile; then | ||
| echo "::error::Makefile coverage target is missing --all-features flag!" | ||
| echo "This causes 0% coverage. See commit 4badee1 for context." | ||
| exit 1 | ||
| fi | ||
| echo "✅ Makefile coverage target has --all-features" | ||
| check: | ||
| name: Check | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: dtolnay/rust-toolchain@stable | ||
| - uses: Swatinem/rust-cache@v2 | ||
| - name: Install system dependencies | ||
| run: sudo apt-get update && sudo apt-get install -y libasound2-dev | ||
| - name: Check | ||
| run: cargo check --all-features | ||
| fmt: | ||
| name: Format | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: dtolnay/rust-toolchain@stable | ||
| with: | ||
| components: rustfmt | ||
| - name: Format check | ||
| run: cargo fmt --all -- --check | ||
| clippy: | ||
| name: Clippy | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: dtolnay/rust-toolchain@stable | ||
| with: | ||
| components: clippy | ||
| - uses: Swatinem/rust-cache@v2 | ||
| - name: Install system dependencies | ||
| run: sudo apt-get update && sudo apt-get install -y libasound2-dev | ||
| - name: Clippy | ||
| run: cargo clippy --all-targets --all-features -- -D warnings | ||
| test: | ||
| name: Test | ||
| strategy: | ||
| fail-fast: "false" # Don't cancel other jobs if one fails | ||
| matrix: | ||
| os: [ubuntu-latest, macos-latest, windows-latest] | ||
| runs-on: ${{ matrix.os }} | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: dtolnay/rust-toolchain@stable | ||
| - uses: Swatinem/rust-cache@v2 | ||
| - name: Install system dependencies (Linux) | ||
| if: runner.os == 'Linux' | ||
| run: sudo apt-get update && sudo apt-get install -y libasound2-dev | ||
| - name: Unit tests | ||
| run: cargo test --lib | ||
| - name: Integration tests | ||
| run: cargo test --test integration | ||
| continue-on-error: ${{ matrix.os != 'ubuntu-latest' }} # renacer has Linux-only ptrace | ||
| - name: Property tests | ||
| run: cargo test --test property_tests | ||
| env: | ||
| PROPTEST_CASES: 256 | ||
| - name: Doc tests | ||
| run: cargo test --doc | ||
| - name: All tests | ||
| run: cargo test --all | ||
| continue-on-error: ${{ matrix.os != 'ubuntu-latest' }} # Some deps have platform issues | ||
| rosetta: | ||
| name: Rosetta Stone Verification | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: dtolnay/rust-toolchain@stable | ||
| - uses: Swatinem/rust-cache@v2 | ||
| - name: Install system dependencies | ||
| run: sudo apt-get update && sudo apt-get install -y libasound2-dev | ||
| - name: Verify zero ignored tests | ||
| run: | | ||
| IGNORED=$(cargo test rosetta --lib -- --ignored 2>&1 | grep "0 passed" || echo "none") | ||
| if echo "$IGNORED" | grep -q "0 passed"; then | ||
| echo "✅ Zero ignored tests in Rosetta Stone" | ||
| else | ||
| echo "⚠️ Note: Running ignored tests (if any exist)" | ||
| fi | ||
| - name: Run Rosetta Stone tests (82 expected) | ||
| run: | | ||
| OUTPUT=$(cargo test rosetta --lib 2>&1) | ||
| echo "$OUTPUT" | ||
| if echo "$OUTPUT" | grep -q "82 passed"; then | ||
| echo "✅ All 82 Rosetta Stone tests pass" | ||
| else | ||
| echo "::warning::Test count may have changed from 82" | ||
| fi | ||
| - name: Run Rosetta Stone example | ||
| run: cargo run --example rosetta_stone | ||
| qa-verify: | ||
| name: QA Verify (PMAT-QA-RUST-001) | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: dtolnay/rust-toolchain@stable | ||
| with: | ||
| components: clippy, rustfmt | ||
| - uses: Swatinem/rust-cache@v2 | ||
| - name: Install system dependencies | ||
| run: sudo apt-get update && sudo apt-get install -y libasound2-dev | ||
| - name: Run qa_verify example (20 point checklist) | ||
| run: | | ||
| echo "╔══════════════════════════════════════════════════════════════╗" | ||
| echo "║ PMAT-QA-RUST-001: Popperian Falsification Suite ║" | ||
| echo "║ Replaces: qa-verify.sh, all-modules-qa-verify.sh, ║" | ||
| echo "║ math-qa-verify.sh (3,929 LOC → 343 LOC) ║" | ||
| echo "╚══════════════════════════════════════════════════════════════╝" | ||
| cargo run --example qa_verify | ||
| - name: Verify all gates passed | ||
| run: | | ||
| # Run again and capture exit code | ||
| if cargo run --example qa_verify; then | ||
| echo "✅ All quality gates PASSED (Grade A+)" | ||
| else | ||
| echo "::error::Quality gates FAILED - see qa_verify output above" | ||
| exit 1 | ||
| fi | ||
| coverage: | ||
| name: Coverage | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: dtolnay/rust-toolchain@stable | ||
| with: | ||
| components: llvm-tools-preview | ||
| - uses: Swatinem/rust-cache@v2 | ||
| - name: Install system dependencies | ||
| run: sudo apt-get update && sudo apt-get install -y libasound2-dev | ||
| - name: Install cargo-llvm-cov | ||
| uses: taiki-e/install-action@cargo-llvm-cov | ||
| - name: Generate coverage | ||
| run: cargo llvm-cov --all-features --workspace --lcov --output-path lcov.info --ignore-filename-regex '(crates/|fuzz/|golden_traces/)' | ||
| - name: Upload coverage | ||
| uses: codecov/codecov-action@v4 | ||
| with: | ||
| files: lcov.info | ||
| fail_ci_if_error: "false" | ||
| mutants: | ||
| name: Mutation Testing | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: dtolnay/rust-toolchain@stable | ||
| - uses: Swatinem/rust-cache@v2 | ||
| - name: Install cargo-mutants | ||
| uses: taiki-e/install-action@v2 | ||
| with: | ||
| tool: cargo-mutants | ||
| - name: Run mutation tests (sample) | ||
| run: cargo mutants --no-times --timeout 300 --in-place -- --all-features | ||
| continue-on-error: "true" | ||
| - name: Upload mutants results | ||
| if: always() | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: mutants-results | ||
| path: mutants.out/ | ||
| retention-days: 30 | ||
| security: | ||
| name: Security Audit | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: rustsec/audit-check@v2 | ||
| with: | ||
| token: ${{ secrets.GITHUB_TOKEN }} | ||
| deny: | ||
| name: Dependency Check | ||
| runs-on: ubuntu-latest | ||
| continue-on-error: "true" # Unmaintained transitive deps (bincode, instant) cause failures | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: EmbarkStudios/cargo-deny-action@v2 | ||
| docs: | ||
| name: Documentation | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: dtolnay/rust-toolchain@stable | ||
| - uses: Swatinem/rust-cache@v2 | ||
| - name: Install system dependencies | ||
| run: sudo apt-get update && sudo apt-get install -y libasound2-dev | ||
| - name: Build docs | ||
| run: cargo doc --no-deps --all-features | ||
| env: | ||
| RUSTDOCFLAGS: -Dwarnings | ||
| shellcheck: | ||
| name: Shellcheck | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - name: Shellcheck | ||
| run: shellcheck --severity=error scripts/*.sh | ||
| continue-on-error: "true" # Warnings don't block CI | ||
| kani: | ||
| name: Kani (Bounded Model Checking) | ||
| runs-on: ubuntu-latest | ||
| continue-on-error: "true" # Kani is optional — proof harnesses may timeout | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - name: Install Kani | ||
| run: | | ||
| cargo install --locked kani-verifier || true | ||
| cargo kani setup || true | ||
| - name: Run Kani proofs | ||
| run: | | ||
| if command -v cargo-kani &> /dev/null; then | ||
| cargo kani --harness proof_q4k_block_size_invariant || true | ||
| cargo kani --harness proof_q6k_block_size_invariant || true | ||
| cargo kani --harness proof_shape_reversal_involution || true | ||
| else | ||
| echo "::warning::Kani not available — skipping proof verification" | ||
| fi | ||
| miri: | ||
| name: Miri (Undefined Behavior Detection) | ||
| runs-on: ubuntu-latest | ||
| continue-on-error: "true" # Miri may fail on FFI/GPU code paths | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: dtolnay/rust-toolchain@nightly | ||
| with: | ||
| components: miri | ||
| - uses: Swatinem/rust-cache@v2 | ||
| - name: Install system dependencies | ||
| run: sudo apt-get update && sudo apt-get install -y libasound2-dev | ||
| - name: Run Miri on core library (no FFI/IO) | ||
| run: | | ||
| cargo +nightly miri test --lib --no-default-features -- \ | ||
| --skip gpu --skip cuda --skip audio --skip speech --skip prop \ | ||
| --skip bundle --skip format --skip mmap --skip tempfile --skip file \ | ||
| --skip serializ --skip golden --skip merge --skip import \ | ||
| --skip export --skip convert --skip rosetta --skip ensemble \ | ||
| --skip velocity --skip harness --skip diff --skip verify | ||
| env: | ||
| MIRIFLAGS: -Zmiri-disable-isolation -Zmiri-permissive-provenance | ||
| wasm: | ||
| name: WASM Compatibility | ||
| runs-on: ubuntu-latest | ||
| continue-on-error: "true" # WASM check may fail due to transitive dependencies (hostname crate) | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: dtolnay/rust-toolchain@stable | ||
| with: | ||
| targets: wasm32-unknown-unknown | ||
| - uses: Swatinem/rust-cache@v2 | ||
| - name: Check core (no features) | ||
| run: cargo check --target wasm32-unknown-unknown --no-default-features | ||
| - name: Check with crypto | ||
| run: cargo check --target wasm32-unknown-unknown --no-default-features --features format-encryption,format-signing | ||
| - name: Check with compression | ||
| run: cargo check --target wasm32-unknown-unknown --no-default-features --features format-compression | ||
| build: | ||
| name: Build | ||
| runs-on: ubuntu-latest | ||
| needs: [check, fmt, clippy, test, rosetta, qa-verify, security] # deny and wasm are non-blocking | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: dtolnay/rust-toolchain@stable | ||
| - uses: Swatinem/rust-cache@v2 | ||
| - name: Build release | ||
| run: cargo build --release | ||
| - name: Run examples | ||
| run: | | ||
| cargo run --example boston_housing | ||
| cargo run --example iris_clustering | ||
| cargo run --example dataframe_basics | ||
| cargo run --example rosetta_stone | ||
| chaos: | ||
| name: Chaos Testing (aprender-shell) | ||
| runs-on: ubuntu-latest | ||
| needs: [check, fmt, clippy, test] | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: dtolnay/rust-toolchain@stable | ||
| - uses: Swatinem/rust-cache@v2 | ||
| - name: Checkout renacer | ||
| uses: actions/checkout@v4 | ||
| with: | ||
| repository: paiml/renacer | ||
| path: ../renacer | ||
| - name: Build renacer | ||
| run: cargo build --release --manifest-path ../renacer/Cargo.toml | ||
| - name: Add renacer to PATH | ||
| run: echo "../renacer/target/release" >> $GITHUB_PATH | ||
| - name: Build aprender-shell | ||
| run: cargo build --release -p aprender-shell | ||
| - name: Run chaos baseline tests | ||
| run: ./crates/aprender-shell/scripts/chaos-baseline.sh ci | ||
| - name: Upload chaos test results | ||
| if: always() | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: chaos-results | ||
| path: /tmp/chaos-results/ | ||
| retention-days: 30 | ||