Modules
Runtime shared by the framework adapters (skipper_ex_unit, skipper_espec):
load the spreadsheet once per run, answer "should this test run?", collect
discovered test IDs, then emit the report and sync at the end.
Reads the spreadsheet: primary sheet plus reference sheets, merged.
Skipper configuration.
Quarantine-debt summary emitted at the end of a run.
Decides whether a test runs. Tests not in the spreadsheet always run
(opt-out model); a test with a future disabledUntil is skipped.
The four Google Sheets v4 calls Skipper needs. An API handle is
{module, client}; Skipper.SheetsApi.HTTP is the real implementation and
tests can pass an in-memory fake.
Sheets API over HTTPS (:httpc), authenticated with a service-account JWT
(OAuth 2.0 jwt-bearer grant, RS256 signed with :public_key).
Test ID helpers: relative/path > part1 > part2, matched case-insensitively.
Reconciles the primary sheet with the test IDs discovered in a run: new IDs
are appended (empty disabledUntil); stale rows of the same files are
deleted only with SKIPPER_SYNC_ALLOW_DELETE=true. Existing rows are never
modified.