Check every rule of ADR 0285, point ADR 0253 at it under its verdict rule, and cite the pull requests
mesh/merge-gate pass: the change touches no module of the mesh's graph
mesh/repo-check pass: its merge-check.sh passed
mesh/delivery delivered
mesh/delivery-group group feat/400-alert-names-its-issue delivered: every member is delivered

Review of hq#299.
This commit is contained in:
jochen
2026-10-10 22:09:24 +02:00
parent c79e416757
commit 8f99511160
3 changed files with 15 additions and 8 deletions
+1
View File
@@ -524,6 +524,7 @@ asking, never the act. **Decided by** ADR 0152, 0175, 0234, 0259, 0272.
it means; the line said when it clears. Its **actions** are the answers a notification offers. Carried by
the condition beside its **summary**, which keeps the plans, commits and verbs for whoever looks closer
([ADR 0253](../02-DECISIONS/0253-a-condition-says-itself-to-the-operator-in-plain-words-beside-its-summary.md)).
The router may override "Nothing for you to do." in what it says, from the **tracking line** (ADR 0285).
- **ask** — a request for the operator's input, of a declared kind (yes-no, one-of, text, number,
date, acknowledge). An **authorising ask** is one whose chosen option its asker performs. The router
holds every ask, checks each answer's proofs and issues a **warrant**; the asker acts on it with its
@@ -117,16 +117,18 @@ What the mesh had, on the main branches of 2026-10-08:
"agent", no "session", and `needs` never says "by hand". `needs` is one sentence ending in a full stop.
Words that break the rule are replaced by the scope's words and reported; a condition is never refused
for its words.
> **The mechanism changed — 2026-10-10, by [ADR 0285](0285-an-issue-tracks-a-condition-by-its-key-and-every-message-about-the-condition-says-the-issue-and-where-it-stands.md).** What stands: the condition's own
> words, their plain rule and their verdict, made where the condition is made. What moved: the router adds the
> **tracking line** below the explanation, naming the issue that tracks the condition by its number (the one
> numbered id a message may carry), and changes "Nothing for you to do." to "Needs you: answer issue N." while that
> issue waits for the operator, or leaves it out while nobody works on any issue tracking it.
4. **Whether the operator is needed is decided per condition, by its producer.** "Nothing for you to do."
is said where the mesh handles it or it passes by itself; "Needs you:" where only the operator can do
the next thing. A condition a healer gave up on (`resolver: operator` with attempts) that needed nothing
now needs the operator: its verdict becomes "Needs you:".
> **The mechanism changed — 2026-10-10, by [ADR 0285](0285-an-issue-tracks-a-condition-by-its-key-and-every-message-about-the-condition-says-the-issue-and-where-it-stands.md).** What stands: the producer
> decides the condition's own verdict (rule 4), and the condition's words keep the plain rule (rule 3). What moved: the
> router says, below the explanation, the **tracking line** naming the issue that tracks the condition by its number,
> the one numbered id a message may carry; and in what it says, it overrides "Nothing for you to do." in two cases:
> it becomes "Needs you: answer issue N." while that issue waits for the operator, and it is left out while nobody
> works on any issue tracking the condition. Why: the operator could not tell from a notification whether its cause
> was known and being fixed (issue 400), and the producer of a condition does not know the issues that track it.
5. **A warning that needs nothing is not sent.** The operator channel keeps it open, its history says it
was kept quiet, and it is said the moment it needs the operator: when it becomes urgent at its bound, or
when its words change to "Needs you:". An urgent condition is always said. At this decision these kinds
@@ -109,7 +109,8 @@ way. It is a read: it changes nothing and emits nothing.
The router invokes `issue-tracker.tracking` over the bus, outside its work: at most once a minute, waiting at most
5 seconds, and a failed ask is tried again a minute later. It uses an answer for **10 minutes**. Every message about
a condition (raised, reopened, reminded, escalated, quiet reminder) says one line below the explanation and before
since when, the **tracking line**. A clearing and a silence say none, and neither does a module's notice.
since when, the **tracking line**. A clearing and a silence say none, and neither does a module's notice, nor a
message whose words the content rule withheld whole.
| The issue | The tracking line says |
|---|---|
@@ -135,7 +136,7 @@ as issue N:", at most **3**, then "And K more issues." Times are the operator's,
### 4. The verdict
- "Nothing for you to do." becomes **"Needs you: answer issue N."** while an issue tracking the condition needs
- "Nothing for you to do." becomes **"Needs you: answer issue N."** ("answer issues N and M." for several) while an issue tracking the condition needs
the operator (`needs: operator`), is not closed, and has no fix merged. **The router never says "Nothing for you
to do." about a condition whose issue waits for the operator.**
- "Nothing for you to do." is **left out** while nobody works on any issue tracking the condition: each is closed
@@ -181,6 +182,8 @@ issue tracks it links that issue first, so the silence and the message agree. Pl
| `tracking` answers by key, those not closed first, at most ten per key, with worker, stale, needs and fix; only the keys asked when given; a key not of a key's shape refused | the tracker's tests (mesh-catalog `modules/mesh-issues`, `tracking_test.go`) |
| Its answer carries no title, report or note | the tracker's verb test, over an issue whose note holds a secret's shape |
| `fix` follows the delivery's facts, in the delivery line's order | the tracker's table test of `FixState`, one row per state |
| `tracking` is a read: it emits nothing and writes nothing | the tracker's verb test calls it and finds no event said and no revision changed |
| The link is set by whoever opens the issue or works on it, an agent at once; never by the triage or the controller | no code sets a `condition` link (the triage's and the controller's code hold none, which the review of each change to them sees); that agents set it is checked by nothing mechanical: a condition an issue is about that says "No issue tracks this yet." is the visible gap, and playbook 03's reviewer looks for the link |
| Live | on the mesh, issue 352 linked to the rolled-back healer-wanted key and 379 and 386 to the mounts key: the next message about each names its issues and where they stand |
## References
@@ -189,4 +192,5 @@ issue tracks it links that issue first, so the silence and the message agree. Pl
- [ADR 0253](0253-a-condition-says-itself-to-the-operator-in-plain-words-beside-its-summary.md): the plain words and the verdict this record extends
- [ADR 0284](0284-an-agent-moves-an-issue-to-fixing-under-its-own-name-and-an-issue-is-resolved-only-from-fixing.md): the worker this record says
- [ADR 0281](0281-an-issue-knows-whether-its-fix-is-delivered-and-a-fix-stuck-after-its-merge-is-loud.md): where a fix is
- mesh-catalog#191 (the tracker's `tracking` and the router's tracking line) and hq#299 (this record)
- [To-be 53](../03-DESIGN/01-to-be/53-the-issue-tracker.md) and [to-be 45](../03-DESIGN/01-to-be/45-a-core-that-cannot-fail-silently.md): the designs this record amends