labels are add-only: remove_labels must not exist, and a mixed call must not half-apply #891

Open
opened 2026-10-23 22:09:35 +00:00 by hexajon · 0 comments
Owner

madt_issues action=edit with add_labels and remove_labels fails with "refusing this forge write ... the forge does not show every removed commit as reachable from the default branch". Removing a label is a destructive act, and madtea does not remove labels: labels are add-only, the same rule that ADR 0057 sets for repo topics. Three things are wrong today:

  • The surface still offers removal: remove_labels on madt_issues and madt_prs edit, madt_labels assign_mode=remove, a label set that drops a label, and the CLI equivalents. Under ADR 0029 a destructive operation is absent from the surface, not refused at the forge.
  • The refusal names unreachable commits, which has nothing to do with labels.
  • A call that adds and removes is not refused as a whole before any write, so the add can land while the remove fails.

Acceptance criteria

  • No first-class surface removes a label from an issue or PR: remove_labels and assign_mode=remove are gone, and a label set that would drop a label refuses and names each dropped label.
  • add_labels and assign_mode=add keep working.
  • A call that still asks for a removal refuses before any write, so nothing half-applies.
  • The issue-label DELETE endpoints stay destroy effects, and their refusal says that madtea does not remove labels, not that commits are unreachable.
  • The add-only label rule is recorded in a decision record, the way ADR 0057 records it for topics.
`madt_issues action=edit` with `add_labels` and `remove_labels` fails with "refusing this forge write ... the forge does not show every removed commit as reachable from the default branch". Removing a label is a destructive act, and madtea does not remove labels: labels are add-only, the same rule that ADR 0057 sets for repo topics. Three things are wrong today: - The surface still offers removal: `remove_labels` on `madt_issues` and `madt_prs` edit, `madt_labels assign_mode=remove`, a label `set` that drops a label, and the CLI equivalents. Under ADR 0029 a destructive operation is absent from the surface, not refused at the forge. - The refusal names unreachable commits, which has nothing to do with labels. - A call that adds and removes is not refused as a whole before any write, so the add can land while the remove fails. ## Acceptance criteria - No first-class surface removes a label from an issue or PR: `remove_labels` and `assign_mode=remove` are gone, and a label `set` that would drop a label refuses and names each dropped label. - `add_labels` and `assign_mode=add` keep working. - A call that still asks for a removal refuses before any write, so nothing half-applies. - The issue-label DELETE endpoints stay destroy effects, and their refusal says that madtea does not remove labels, not that commits are unreachable. - The add-only label rule is recorded in a decision record, the way ADR 0057 records it for topics.
hexajon changed title from issues edit remove_labels is refused as a destructive write to labels are add-only: remove_labels must not exist, and a mixed call must not half-apply 2026-10-23 22:16:02 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
sixfold-space/madtea#891
No description provided.