Running vitest --coverage without a provider installed prompts to add one; nothing is bundled with Vitest itself. The default provider is v8, supplied by the @vitest/coverage-v8 package, and the alternative is @vitest/coverage-istanbul.
The two do not agree on the same code. The v8 provider reads coverage of the transformed output from the engine and maps it back through source maps, so a line can be attributed differently than expected after a transform. The istanbul provider instruments the source before running it, which is slower but produces counts that line up with what you read in the file. Switching providers to chase a threshold failure usually means the number was never comparable in the first place.
Coverage is off by default, so it runs only with the flag or with coverage.enabled set in config. Thresholds are enforced under coverage.thresholds, and thresholds.autoUpdate writes current values back into the config file, which is a practical way to ratchet coverage upward without inventing a target. Which untested files count toward the total has changed across major versions, so check option names against the version actually installed rather than copying a config from an older project.