diff --git a/02-DECISIONS/0294-an-issues-fixes-are-its-fixed-by-and-its-linked-pull-requests-and-a-fix-delivered-and-not-resolved-is-loud.md b/02-DECISIONS/0294-an-issues-fixes-are-its-fixed-by-and-its-linked-pull-requests-and-a-fix-delivered-and-not-resolved-is-loud.md index 366ceaca..1eca8a4f 100644 --- a/02-DECISIONS/0294-an-issues-fixes-are-its-fixed-by-and-its-linked-pull-requests-and-a-fix-delivered-and-not-resolved-is-loud.md +++ b/02-DECISIONS/0294-an-issues-fixes-are-its-fixed-by-and-its-linked-pull-requests-and-a-fix-delivered-and-not-resolved-is-loud.md @@ -46,50 +46,30 @@ measured on 2026-10-11: ## Decision -### 1. An issue's fixes are its fixed-by and its linked pull requests +1. **An issue's fixes are its fixed-by and its linked pull requests.** The pull requests an issue's `fixed-by` names and those it links with kind `pull-request` are its **fixes**. The + delivery line, the ready-to-verify note, the stuck fix of ADR 0281 §4 and `tracking`'s `fix` are measured on them. + Readiness (ADR 0279 §3) still reads `fixed-by` alone: a resolved issue's `fixed-by` is what fixed it, and a pull + request linked and abandoned must not hold its dependents back. -The pull requests an issue's `fixed-by` names and those it links with kind `pull-request` are its **fixes**. The -delivery line, the ready-to-verify note, the stuck fix of ADR 0281 §4 and `tracking`'s `fix` are measured on them. -Readiness (ADR 0279 §3) still reads `fixed-by` alone: a resolved issue's `fixed-by` is what fixed it, and a pull -request linked and abandoned must not hold its dependents back. - -This replaces ADR 0281 §1's "for each pull request an issue's `fixed-by` names" and §2's list over those. - -### 2. Merged is the pull request's own word, and a closed one is withdrawn - -Whether a fix is merged is read from the delivery's `merged_as` or the pull request's own `merged` flag, never from -the delivery's state. A fix `stopped` and never merged is **withdrawn**: not a fix waiting for delivery, not -delivered, and not open. The delivery line says "fix withdrawn: …" when every fix is withdrawn. - -### 3. A fix never heard of is asked at the sweep too - -Besides the asks at the tracker's own `moved` (ADR 0281 §1, at most three per handling), every five-minute sweep -asks mesh-delivery's `checks` for at most five fixes it never heard of, of issues not resolved. A pull request linked -after its delivery moved hears no transition again; without this it would never be measured. - -### 4. The ready-to-verify note names when and who - -The note names each fix with when it was delivered, and the issue's worker; the event `ready-to-verify` carries -`worker` and `delivered-at`. No channel of the tracker reaches a worker, so the note and the event are how it hears. - -### 5. Delivered, not resolved, is loud - -An issue at `fixing` whose every fix is delivered is **delivered, not resolved**. When it has stayed so past the -setting `delivered-not-resolved-after` (**one hour** by default) after its last fix was delivered, the tracker says -it once as a warning on the operator's channel, key `issue-tracker.delivered-not-resolved.`, naming the issue -and its worker. The warning clears when the issue leaves `fixing` or names a fix not yet delivered. One hour is -more than proving an acceptance live takes, and short enough that a worker who left is noticed the same day. - -### 6. An abandoned issue is shown, and taken over without a reason - -An issue at `diagnosing` or `fixing` whose worker is stale (ADR 0284 §4) and that has no pull request open (open: -neither merged nor withdrawn, or never heard of) is **abandoned**. `get` and its `list` row say `abandoned`. A move by -another worker takes it over without a reason, as ADR 0284 §4 already allows of any stale worker; the answer, the -take-over note and the `moved` event say it was abandoned. - -### 7. list filters on both - -`list` takes `flag`: `delivered-not-resolved` or `abandoned`, so the operator sees what is truly being worked on. + This replaces ADR 0281 §1's "for each pull request an issue's `fixed-by` names" and §2's list over those. +2. **Merged is the pull request's own word, and a closed one is withdrawn.** Whether a fix is merged is read from the delivery's `merged_as` or the pull request's own `merged` flag, never from + the delivery's state. A fix `stopped` and never merged is **withdrawn**: not a fix waiting for delivery, not + delivered, and not open. The delivery line says "fix withdrawn: …" when every fix is withdrawn. +3. **A fix never heard of is asked at the sweep too.** Besides the asks at the tracker's own `moved` (ADR 0281 §1, at most three per handling), every five-minute sweep + asks mesh-delivery's `checks` for at most five fixes it never heard of, of issues not resolved. A pull request linked + after its delivery moved hears no transition again; without this it would never be measured. +4. **The ready-to-verify note names when and who.** The note names each fix with when it was delivered, and the issue's worker; the event `ready-to-verify` carries + `worker` and `delivered-at`. No channel of the tracker reaches a worker, so the note and the event are how it hears. +5. **Delivered, not resolved, is loud.** An issue at `fixing` whose every fix is delivered is **delivered, not resolved**. When it has stayed so past the + setting `delivered-not-resolved-after` (**one hour** by default) after its last fix was delivered, the tracker says + it once as a warning on the operator's channel, key `issue-tracker.delivered-not-resolved.`, naming the issue + and its worker. The warning clears when the issue leaves `fixing` or names a fix not yet delivered. One hour is + more than proving an acceptance live takes, and short enough that a worker who left is noticed the same day. +6. **An abandoned issue is shown, and taken over without a reason.** An issue at `diagnosing` or `fixing` whose worker is stale (ADR 0284 §4) and that has no pull request open (open: + neither merged nor withdrawn, or never heard of) is **abandoned**. `get` and its `list` row say `abandoned`. A move by + another worker takes it over without a reason, as ADR 0284 §4 already allows of any stale worker; the answer, the + take-over note and the `moved` event say it was abandoned. +7. **`list` filters on both.** `list` takes `flag`: `delivered-not-resolved` or `abandoned`, so the operator sees what is truly being worked on. ## Consequences