coverage: status: project: default: # Allow small fluctuations without failing the status check. # target: auto sets the target to the current coverage; the # threshold gives a small tolerance so a 0.02% blip (e.g. from # adding config defaults) doesn't break the check. target: auto threshold: 1% patch: default: # New/changed code in a PR must be at least 80% covered — a standard # floor that catches genuinely untested features while accepting that # defensive error branches (sync/close/chmod failures, OS-specific # dispatch, rollback-also-fails paths) are impractical to exercise # without fragile tests. The project status above (90%+) remains the # primary overall gate; this is a real (non-informational) floor so a # PR that ships mostly-untested code still fails. target: 80% # Paths excluded from both project and patch coverage. These are either # never compiled into the coverage run or are generated/vendored — counting # them as diff lines produces false patch-coverage failures. ignore: # Build-tagged e2e suites (//go:build e2e / live). `go test -cover` does # not compile them, so they never appear in coverage.out; without this # ignore, adding an e2e test file fails the 80% patch gate on every PR. - "test/e2e/**" # Custom-tagged platform stubs (non-_GOOS-suffixed //go:build !unix files). # Compiled only on non-Unix hosts; no coverage-upload job can ever hit them, # so their diff lines permanently failed the server-side patch gate (see the # earlier e2e/desktop entries for precedent). - "internal/history/restore_source_identity_other.go" - "internal/history/restore_source_nofollow_other.go" - "internal/downloader/restore_source_identity_other.go" - "internal/downloader/restore_source_nofollow_other.go" # //go:build windows companions to the stubs above — compiled only on # Windows hosts, so no coverage-upload job ever hits them either. - "internal/history/restore_source_nofollow_windows.go" - "internal/downloader/restore_source_nofollow_windows.go" # //go:build windows leg of the wave-30 publish-with-reverify helper # (PublishStagedBound): MoveFileEx cannot rename an open Go handle, so the # Windows leg keeps a prove-close-publish-reverify posture that compiles # only on Windows — no ubuntu coverage-upload job ever hits those lines. # The shared interface + POSIX recovery legs ARE fully covered # (publish_staged_bound.go / publish_staged_bound_unix.go). - "internal/fsutil/publish_staged_bound_windows.go" # The non-Linux variants of the wave-38 bound take-aside kernel identity # extractor (bound_take.go): //go:build windows (other) and darwin-family # (narrow unix) files — the ubuntu coverage-upload job compiles only the # posix variant. - "internal/fsutil/bound_identity_narrow_unix.go" - "internal/fsutil/bound_identity_other.go" # The Windows handle-route twin of the admission-time object identity # capture (BoundObjectIdentity — volume serial + file index via # GetFileInformationByHandle): //go:build windows, so the ubuntu # coverage-upload job never compiles these lines; the POSIX wrapper legs of # the same helper ARE covered through workflow/organizer/fsutil tests. - "internal/fsutil/bound_identity_windows.go" # The Windows (//go:build windows) delete-shared source open of the # verified composites (openVerifiedSource): Go's os.Open omits # FILE_SHARE_DELETE, so the OsFs leg runs raw CreateFile — compiled only # on Windows hosts. The POSIX passthrough twin and every caller ARE # covered (verified_source_open_posix.go / move_verified.go). - "internal/fsutil/verified_source_open_windows.go" # Desktop-only build-tagged file (//go:build desktop). The real Wails # runner pulls in per-platform webview headers and must not enter the # default build/test path; without this ignore, its new lines all count # as patch misses and fail the 80% gate. The non-tagged companion logic # (paths.go, server.go, redirector.go, app_stub.go) IS covered. - "internal/desktop/app.go" # swag-generated API docs + //go:embed wrappers (no testable logic). - "docs/swagger/**" # //go:embed wrapper for the built frontend; the frontend has its own # vitest suite, not Go coverage. - "web/**" # Vendored deps that ship Go files (e.g. flatted/golang). - "**/node_modules/**" # mockery-generated mocks — regenerated wholesale on every interface # change; their bodies have no testable behavior (CI's make check-mocks # guards freshness instead). - "internal/mocks/**" comment: layout: "reach,diff,flags,files" behavior: default require_changes: false