dig-coinstore 0.1.3

DIG L2 global coin state database — persistent UTXO store with Merkle proofs, hint indexing, and rollback support
# PR quality gates for dig-coinstore (Rust). Runs on every pull request to main
# (and on push to main) and enforces the professional gate set: formatting,
# clippy (warnings-as-errors), the full test suite, and line coverage >=80%.
# Each job's `name:` is stable and becomes the required-check context.
name: CI

on:
  pull_request:
    branches:
      - main
  push:
    branches:
      - main

concurrency:
  group: ${{ github.ref }}-${{ github.workflow }}-${{ github.event_name }}
  cancel-in-progress: true

env:
  CARGO_TERM_COLOR: always

jobs:
  fmt:
    name: Format (rustfmt)
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt

      - name: Check formatting
        run: cargo fmt --all -- --check

  clippy:
    name: Clippy (lint)
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2

      - name: Clippy (warnings as errors)
        run: cargo clippy --all-targets --all-features -- -D warnings

  test:
    name: Test + coverage
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          components: llvm-tools-preview

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2

      - name: Install cargo-llvm-cov
        uses: taiki-e/install-action@v2
        with:
          tool: cargo-llvm-cov

      - name: Install cargo-nextest
        uses: taiki-e/install-action@v2
        with:
          tool: nextest

      # Line coverage gated at >=80% (measured ~91% at authoring). Storage
      # backends (rocksdb/lmdb) use on-disk files, so tests run single-threaded
      # to avoid cross-test lock contention. Run under nextest so a test that
      # fails then passes on retry is reported as flaky rather than a silent
      # pass (#489).
      - name: Test + coverage (fail under 80% lines)
        run: cargo llvm-cov nextest --workspace --all-features --fail-under-lines 80 --retries 2 --test-threads 1