Write ADR 0294's decision as numbered clauses, as an accepted record's must be (issue 483)
mesh/merge-gate pass: the change touches no module of the mesh's graph
mesh/repo-check pass: THE CHANGE ALTERS ITS OWN CHECK (merge-check.sh): main's version judged it; the change's judges the pull requests after it merges; it…
mesh/delivery superseded: a newer head of the same pull request

This commit is contained in:
2026-10-11 17:55:56 +02:00
parent 14b53900dd
commit eb6332bee6
@@ -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.<number>`, 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.<number>`, 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