# Codecov config. Coverage is REPORTED here for visibility (PR comment, trend # graphs, per-crate breakdown). The REAL gate is the CI line floor in # .github/workflows/ci.yml (the `coverage (>= 90% lines)` job runs # `cargo llvm-cov --fail-under-lines 90`). The `project` status is # informational (a nudge, never a block). `patch` is a real pass/fail traffic # light on new-code coverage. Neither is a *required* check unless it is added # to branch protection. Coverage uploads from ONE Linux cell, so flags, # carryforward, and report-merging are not needed. # # Rust note: Codecov ingests the lcov that `cargo llvm-cov --lcov` emits # directly; no cobertura conversion step is needed. # # Baseline: ~94% lines excluding src/main.rs (feed/selfcheck/ui/prober/ # chapters/index are all ≥98%; splitter is the lowest). src/main.rs is 0% (the # live server wiring, not unit-testable) and is excluded from the report via # `ignore` below. # # Validate before deploying changes: # curl -X POST --data-binary @codecov.yml https://api.codecov.io/validate codecov: # ci.yml uploads coverage even when the floor step FAILS (the # `!cancelled()` guard), on purpose: a coverage drop must surface exactly # when a change breaks the floor. So do not gate the Codecov status on CI # passing. require_ci_to_pass: false notify: wait_for_ci: false after_n_builds: 1 # single Ubuntu coverage cell coverage: precision: 2 round: down # a strict floor rounds down, matching the CI --fail-under-lines gate range: "88...96" # the red-to-green band around the ~94% baseline status: project: default: target: 90% # mirror the ci.yml line floor threshold: 1% # tolerate sub-1% drift before flagging informational: true # a nudge, never a block; ci.yml is the source of truth patch: default: # New-code (diff) coverage gate. 80% sits below the repo's ~91% # overall, so it flags under-tested new code without chronic red. # Raise it when new PRs comfortably clear a higher bar. target: 80% threshold: 0% # no slack: new code meets the target, or the status goes red informational: false # a real pass/fail traffic light (still a non-required check) if_not_found: success # docs-only PRs upload no diff; do not block them # src/main.rs is the server's live wiring (resolve config, open the index, # scan, bind the socket, serve). A run of the app exercises it, not unit # tests. It cannot be meaningfully unit-tested, so it is excluded from the # REPORTED coverage, and the dashboard then reflects testable code. (The CI # line floor still measures the full tree; it carries enough headroom to # absorb this ~0.8% of lines.) ignore: - "src/main.rs" # Dev-only test scaffolding (skip!/scratch/ffmpeg synths): it only ever # runs inside tests, so "coverage" of it is noise, for the same reason as # src/main.rs. - "crates/test-support/src/lib.rs" # The per-line PR annotations are mostly visual clutter; the comment + dashboard # carry the signal. github_checks: annotations: false comment: # No flags are uploaded (single cell), so show the per-crate breakdown instead. layout: "condensed_header, diff, components, files" behavior: default # update the existing comment in place require_changes: true # only comment when coverage actually moves hide_project_coverage: false # Per-crate coverage breakdown in the dashboard + PR comment. No `statuses` are # defined, so components add VISIBILITY only — no extra per-component PR checks. # # IMPORTANT: paths are EXPLICIT FILES, not `crates//**` globs. Codecov's # component matcher silently does NOT pick up a `**` glob here (the component # renders empty even at 100% coverage), whereas explicit file paths DO match. # (Same quirk clauster's codecov.yml hit with its `db/**` / `hooks/**` components.) # So when a crate gains a module, add its `.rs` file here; a glob would look # fine and quietly track nothing. component_management: individual_components: - component_id: scanner name: scanner (library + orchestration) paths: - crates/scanner/src/lib.rs - component_id: probe_chapters name: prober & chapters paths: - crates/prober/src/lib.rs - crates/prober/src/faststart.rs - crates/chapters/src/lib.rs - component_id: splitter name: splitter (ffmpeg) paths: - crates/splitter/src/lib.rs - component_id: feed name: feed (RSS + self-check) paths: - crates/feed/src/lib.rs - crates/feed/src/selfcheck.rs - component_id: http name: http (Axum) paths: - crates/http/src/lib.rs - component_id: ui name: ui (maud) paths: - crates/ui/src/lib.rs - component_id: index name: index (SQLite) paths: - crates/index/src/lib.rs - component_id: config name: config paths: - crates/config/src/lib.rs - crates/config/src/book_overrides.rs - component_id: metrics name: metrics (Prometheus) paths: - crates/metrics/src/lib.rs - component_id: server_cli name: server paths: - src/main.rs