Opt-out reason category: one stable kebab-case id from the list (peer-review, incident-response, customer-support, tooling-and-upkeep, discovery-and-research, planning-and-scoping, business-operations, legal-and-compliance, content-and-communications, admin-and-coordination, documentation, learning-and-onboarding, personal, restricted, other). Aliases and loose spellings are matched. The list is fixed: any value it does not carry (prose, or a slug like 'sprint-cleanup') is recorded as category 'other' with your text kept as the detail. An explicit 'uncategorized' is recorded as 'other', since you sent a value. An unrecognized value is never rejected: it is recorded as other, with your text kept as the detail, so the rest of the attribution is still saved. Omit the field and the stored category is left alone; send explicit null to reset it to 'uncategorized' (nobody was asked). On a brand-new interval an omitted category is 'uncategorized' too, unless the free-text reason sent alongside it is itself a single token naming a category, which is used.