/** * What a team has decided to live with, and how long they have been deciding it. * * 1.40 named this gap and could not fill it: *no document stores past waivers, * and a history invented from the current config would be a guess presented as * a record*. That was the right refusal — a config says what is waived **now**, * and nothing in it says whether the same finding was waived last quarter under * a different reason, or whether the expiry has been pushed forward four times * by four people who each assumed somebody else had looked. * * It is fixable by **recording**, not by inferring. A waiver silences a gate; * the moment it does, that use is a fact with a date on it, and this module * reads those facts back. * * Three rules hold the whole thing up: * * **Nothing is back-filled.** The history starts the day the recording did, * and `since` says which day that was. Reconstructing a past from the present * config is exactly what 1.40 refused, and it would be worse here than * nowhere: a fabricated "waived four times" is an accusation. * * **A use is recorded when the waiver silences something, not when it is * written.** A waiver nobody's build has ever hit is not a habit — it is dead * config, and the report says which it is rather than folding the two together. * * **The verdict describes the record, never the team.** "Renewed without being * revisited" is a statement about dates and reasons in a file. Whether that was * the right call is a conversation this tool does not get to have. */ import type { WaiveEntry } from './config-schema.js'; /** One occasion on which a waiver silenced a gate. */ export interface WaiverUse { schemaVersion: 1; /** The UTC day it happened, `YYYY-MM-DD`. */ day: string; /** The gate silenced — a `WAIVABLE_GATES` entry or `byLabel: