ADR 0285: say in every condition's message which issue tracks it and where it stands (issue 400)

The operator could not tell from a notification whether its cause was
known, tracked and being fixed. An issue tracks a condition by its key;
the tracker answers which issues track which conditions, and the router
says it in every message about the condition. Amends to-be 53 and 45,
playbook 03 and the glossary, and points ADR 0253 at the new line.
This commit is contained in:
jochen
2026-10-10 22:09:24 +02:00
parent 1b84960179
commit c79e416757
6 changed files with 240 additions and 4 deletions
+3
View File
@@ -595,6 +595,9 @@ Not a domain of the mesh but of the way it is built, listed because its words me
worker with nothing done on the issue for a day is **stale**. **Fixing** is the status an issue is at while its fix
is worked on; an issue is resolved only from it ([ADR 0284](../02-DECISIONS/0284-an-agent-moves-an-issue-to-fixing-under-its-own-name-and-an-issue-is-resolved-only-from-fixing.md)).
Not a *claim* or a *holder*, which are a module's on a seat.
- **tracks** — of an issue and a condition: the issue links the condition's key with a link of kind `condition`. The
**tracking line** is the line the router says in every message about a condition: the issues that track it and
where each stands, or that none does ([ADR 0285](../02-DECISIONS/0285-an-issue-tracks-a-condition-by-its-key-and-every-message-about-the-condition-says-the-issue-and-where-it-stands.md)).
- **hq check** — one of `00-META/checks/`, run by `merge-check.sh` as this repository's check.
## Homonyms
+5
View File
@@ -70,6 +70,11 @@ import read, which every imported issue names (`imported.commit` in `issue-track
`replay:` or `replay-none:` in any report, because the tracker holds them and two places holding one fact
drift.
**An issue about a condition** links the condition's key at once: `issue-tracker.link` with kind `condition` and
the key `mesh-controller.conditions` gives. Every message about that condition then names the issue and where it
stands; one no issue links says "No issue tracks this yet." An agent that silences a condition because an issue
tracks it links that issue first ([ADR 0285](../../02-DECISIONS/0285-an-issue-tracks-a-condition-by-its-key-and-every-message-about-the-condition-says-the-issue-and-where-it-stands.md)).
**An issue wholly in the tracker** is done at this step.
2. Investigate. **Before you start, move the issue to `diagnosing` with `by`**: who works on it and its node, as
who@node (`fix-399@laptop`, `operator@workstation`). The tracker keeps you as the issue's **worker**, and `get` and `list`
@@ -117,6 +117,12 @@ 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
@@ -0,0 +1,192 @@
---
topic: the mesh
status: accepted
date: 2026-10-10
deciders: jochen
reconstructed: false
extends: 02-DECISIONS/0253-a-condition-says-itself-to-the-operator-in-plain-words-beside-its-summary.md
---
# 285. An issue tracks a condition by the condition's key, and every message about the condition says the issue and where it stands
## Context
On 2026-10-10 the operator received "mounts not working on the workstation" (urgent) and the daily "Rolled-back keeps being
fixed by hand". Neither message said that issues 379 and 386 already track the first, or that issue 352 tracks the
second's cause and that nobody works on 352. The operator could not tell from a notification whether its cause was
known, tracked and being fixed, or whether they had to act. In their words: "it would be cool if the notification
would tell me an issue already exists but isn't being worked on or something like that" (issue 400).
What the mesh had, on the main branches of 2026-10-10:
- **A condition carries plain words** for the operator: headline, needs, explanation and resolved line, made where
the condition is made ([ADR 0253](0253-a-condition-says-itself-to-the-operator-in-plain-words-beside-its-summary.md)).
The explanation opens with its verdict, "Nothing for you to do." or "Needs you:". The plain rule forbids a
numbered id in those words. A healer-wanted condition, such as the daily one above, says "Nothing for you to do."
- **The router** (the `operator-channel` seat's holder, the module `messenger`) composes each message from those
words when it sends it, and consumes the controller's condition events; the controller "learns nothing about
telling" (to-be 45 §2).
- **The issue tracker** already offers a link of kind `condition` whose target is a condition's key. Nothing set
one, and nothing read one. To-be 53 § 8 named slice 4: "an issue links a condition by its key and the controller
shows the link".
- **An issue says who works on it** ([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, since and stale, from `get`, `list` and the `moved` event; and **where its fix is**
([ADR 0281](0281-an-issue-knows-whether-its-fix-is-delivered-and-a-fix-stuck-after-its-merge-is-loud.md)): merged,
held, failed or delivered.
- **A condition's key** names the thing and the kind, so the same fault said again has the same key; "a key is
opaque to every reader, and the kind is the field" (to-be 45 §2). Today's keys: `module.mounts.<machine>.unhealthy`,
`mesh.hand-acts.rolled-back.healer-wanted`.
The record was searched first ("condition link", "tracked as issue", "issue in a notification", "healer-wanted issue"): to-be
53 § 3 and § 8, to-be 45 § 2 and § 5, ADR 0253 and ADR 0284's consequences, which name this issue.
## Considered Options
### What an issue links
1. **The condition's key, exactly.** Chosen. The key is stable for the same fault (to-be 45 §2), so one link
covers every time the condition is raised again. It keeps keys opaque: nothing parses them.
2. *A kind with a pattern over the subject*, such as every `module-unhealthy` of `mounts`. Rejected: matching reads
inside the key, or needs the subject's fields copied onto the link, and a pattern that matches more than meant
would tell the operator a condition is tracked when it is not. An issue that covers several keys links each.
3. *A free-text description of the condition.* Rejected: nothing could match it reliably.
### Who sets the link
1. *The triage.* Rejected: it judges an issue against other issues with no tools, and does not see the open
conditions or their keys.
2. *The controller, by matching words in issues.* Rejected for the same reason as a pattern.
3. **Whoever opens the issue or works on it, through `issue-tracker.link`.** Chosen. The agent that opens an issue
for a condition knows the key from `mesh-controller.conditions`; an agent that silences a condition because an
issue tracks it links that issue first. Playbook 03 says so.
### Who reads the link and words the line
1. *The controller*, holding the issue on the condition and saying it in the condition's words. Rejected: it would
consume the tracker's events and raise `condition-changed` at each move of an issue, which the router reads as a
change to say; the condition's words would carry a numbered id, which the plain rule forbids for good reason; and
the controller, a core component, would learn about issues, against to-be 45 §2.
2. *The tracker*, wording a line for the operator. Rejected: words for the operator are said in one place, the
router, which knows the operator's time zone and the content rule.
3. **The router, from the tracker's answer, over the bus.** Chosen. The tracker answers facts through a new verb,
`tracking`; the router asks it outside its work, keeps the answer, and words one line in every message about a
condition when the message is composed. The issue's state is as fresh as the message, and nothing about an issue
makes the controller raise anything.
### What the line does to the verdict
1. *Nothing: the line is added below.* Rejected: "Nothing for you to do." above "it waits for your answer" tells the
operator two opposite things, and the operator asked that a daily message not reassure while nobody works on it.
2. **The verdict changes in two cases only.** Chosen: "Nothing for you to do." becomes "Needs you: answer issue N."
while an issue tracking the condition waits for the operator, and is left out while nobody works on any issue
tracking it. A verdict that already says "Needs you:" stands.
3. *The line also changes when a message is sent* (a quiet warning sent because its issue waits on the operator).
Rejected for now: it would raise notifications the operator does not get today, and needs nothing this issue asks
for. The message the operator does get says it.
## Decision
### 1. An issue tracks a condition through a link of kind `condition`
The link's target is the condition's key, exactly as the controller names it, and is checked for a condition key's
shape (at most 200 bytes of lower-case letters, digits and `. _ : = @ -`). An issue may link several keys, within
the 200 links one issue keeps. A key may be linked by several issues. The link is set by whoever opens the issue or
works on it, never by the triage or the controller. A link to a key that is not open now is kept: the same fault
raised again has the same key.
### 2. The tracker answers which issues track which conditions
A new verb of the seat `issue-tracker`, **`tracking`**, takes optionally a list of condition keys and answers, for
every key an issue links (or only those asked), the issues that link it: those not resolved or wontfix first, then
by number, at most **10** per key. Each carries its number, status, severity, needs, its worker with since, active
and stale, and **fix**, one word for where its fix is: `not-merged`, `merged` (not yet delivered), `held`, `failed`,
`unheard` (the delivery said nothing yet) or `delivered`, from the same facts as the delivery line of ADR 0281, and
empty when no fix is named. It carries no title, report or note, so no word an issue holds leaves the tracker this
way. It is a read: it changes nothing and emits nothing.
### 3. The router asks it and says one line in every condition's message
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.
| The issue | The tracking line says |
|---|---|
| none links the key | "No issue tracks this yet." |
| the tracker gave no answer within 10 minutes | "Whether an issue tracks this could not be checked." |
| resolved | "Tracked as issue N: it was resolved, yet this still happens." |
| wontfix | "Tracked as issue N: it will not be fixed." |
| its fix delivered | "Tracked as issue N: its fix is delivered and waits to be checked." |
| its fix merged | "Tracked as issue N: its fix is merged and on its way." |
| its fix held | "Tracked as issue N: its fix is merged and held before it is delivered." |
| its fix's delivery failed | "Tracked as issue N: its fix is merged, but its delivery failed." |
| a worker not stale, at `fixing` | "Tracked as issue N: fix-386 on laptop is fixing it since 21:10." (the worker as who on node) |
| a worker not stale, at `diagnosing` | "Tracked as issue N: … is looking for its cause since 21:10." |
| a fix not merged | "Tracked as issue N: a fix is written and waits to be merged." |
| a fix named, nothing heard of it | "Tracked as issue N: a fix is named, and nothing is heard yet of its delivery." |
| needs the operator | "Tracked as issue N: it waits for your answer." |
| a stale worker | "Tracked as issue N: nobody has worked on it since Tue 10:40." |
| nobody, needing a decision | "Tracked as issue N: nobody is working on it; it waits for a decision first." |
| nobody | "Tracked as issue N: nobody is working on it." |
The first row that holds is said. Several issues are said in turn, those not closed first, the next opened by "Also
as issue N:", at most **3**, then "And K more issues." Times are the operator's, as every time in a message is.
### 4. The verdict
- "Nothing for you to do." becomes **"Needs you: answer issue N."** 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
while the condition still happens, or has no worker who is not stale and no fix written or merged. The tracking
line then says so.
- A verdict that says "Needs you:" stands, and a condition no issue tracks keeps its verdict.
- The line changes words, never when a message is sent: ADR 0253's rules on what is sent stand.
### 5. The issue number is the one numbered id a message may carry
The plain rule of ADR 0253 stands for the condition's own words. The tracking line is the router's, and names an
issue by its number, "issue 386", because the operator names an issue by it to an agent. The content rule (ADR
0234 §6) judges the message with the line in it, as every message.
### 6. Who acts on it
An agent that opens an issue for a condition links its key at once. An agent that silences a condition because an
issue tracks it links that issue first, so the silence and the message agree. Playbook 03 says so.
## Consequences
- Every message about a condition answers "is this known, and is anyone on it?" in one line. A daily reminder
whose issue nobody works on says that, instead of "Nothing for you to do."
- Every message about a condition that no issue tracks now ends with "No issue tracks this yet." This is one more
line the operator reads. It is said on purpose: a message that says nothing about an issue is what issue 400 is about.
- The controller is not changed. `mesh-controller.conditions` does not show the link; `issue-tracker.tracking`
does. To-be 53 § 8's slice 4 ("the controller shows the link") is replaced by this.
- An issue's state reaches a message up to a minute late, and the line says "could not be checked" after ten
minutes without the tracker, never a guess.
- A link the agent forgot is a condition said as untracked. The line says so, and an agent reading it links the
issue.
- The router depends on the tracker for one line only; a tracker that is down changes no message but that line.
## How it is checked
| Rule | Checked by |
|---|---|
| Each row of the table in §3 is said as written; several issues in turn, at most three and a count | the router's table test (mesh-catalog `modules/messenger`, `tracking_test.go`), one case per row |
| "Nothing for you to do." is never said while an issue waits for the operator, nor while nobody works on any issue tracking it; a "Needs you:" verdict stands | the router's verdict tests, over every such case |
| A clearing, a silence and a notice say no tracking line | the router's test of each |
| The router asks outside its work, at most once a minute, uses an answer ten minutes, then says it could not be checked | the router's test through its own event and tick, with a clock the test moves and a tracker that stops answering |
| The content rule passes every line | the table test runs each message through the content rule |
| `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 |
| 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
- Issue 400: the operator's report, wholly in the issue tracker (`issue-tracker.get 400`)
- [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
- [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
@@ -5,6 +5,7 @@ code: [mesh-controller, mesh-host, mesh-tools, mesh-catalog, mesh-sdk, mesh-lab]
updated: 2026-10-10
decisions:
- 02-DECISIONS/0289-the-controller-mirrors-its-records-into-buckets-written-only-on-a-change-and-audited-against-its-store.md
- 02-DECISIONS/0285-an-issue-tracks-a-condition-by-its-key-and-every-message-about-the-condition-says-the-issue-and-where-it-stands.md
- 02-DECISIONS/0276-merges-are-assembled-in-a-rolling-window-and-each-batch-is-delivered-by-one-walk-with-one-commit-per-repository.md
- 02-DECISIONS/0271-a-send-held-for-the-buss-planned-step-is-told-to-the-operator-at-once-and-a-change-that-needs-it-says-so-before-it-merges.md
- 02-DECISIONS/0265-a-verb-that-reads-is-answered-on-the-serving-controllers-own-connection-and-every-connection-says-what-it-is.md
@@ -344,6 +345,16 @@ section; to-be 46 §13 builds what follows from it.
Details. **A warning that needs nothing is not sent**: it is kept, and said when it becomes urgent or
needs the operator. A clearance is one line, the resolved line and how long it was open. A digest lists
titles, and a message that offers answers is never in one. Still deduplicated by the key.
*Amended 2026-10-10, [ADR 0285](../../02-DECISIONS/0285-an-issue-tracks-a-condition-by-its-key-and-every-message-about-the-condition-says-the-issue-and-where-it-stands.md):*
**a condition's message says which issue tracks it.** Below the explanation, the router says the **tracking
line**, from the issue tracker's `tracking` (to-be 53 § 12), asked outside its work at most once a minute and
used ten minutes: "Tracked as issue N:" and where the issue stands in plain words (nobody is working on it; who
is, on which machine, since when; its fix merged and on its way, held, failed or delivered; it waits for your
answer or for a decision; resolved, yet this still happens), at most three issues and then a count; "No issue
tracks this yet."; or "Whether an issue tracks this could not be checked." when the tracker gave no answer in ten
minutes. "Nothing for you to do." becomes "Needs you: answer issue N." while an issue tracking it waits for the
operator, and is left out while nobody works on any issue tracking it. The issue number is the one numbered id a
message may carry. A clearing and a silence say no tracking line; what is sent, and when, does not change.
- **When:** on `condition-raised`; once more if still open after 1 hour (urgent) or 12 hours
(warning); on `condition-cleared`, by editing the first message where the channel can. A silenced
condition sends nothing. Urgent goes to both channels; warning to the desktop notifier when the
+23 -4
View File
@@ -1,7 +1,7 @@
---
layer: to-be
status: in-progress
code: [mesh-catalog modules/mesh-issues, mesh-catalog modules/claude-code, mesh-sdk]
code: [mesh-catalog modules/mesh-issues, mesh-catalog modules/claude-code, mesh-catalog modules/messenger, mesh-sdk]
updated: 2026-10-10
decisions:
- 02-DECISIONS/0275-the-mesh-numbers-and-tracks-its-issues-in-a-module-of-its-own-and-hq-keeps-only-the-narrative-of-a-design-or-governance-issue.md
@@ -9,6 +9,7 @@ decisions:
- 02-DECISIONS/0279-the-issue-tracker-triages-every-new-issue-and-an-issue-is-ready-when-what-it-depends-on-is-delivered.md
- 02-DECISIONS/0281-an-issue-knows-whether-its-fix-is-delivered-and-a-fix-stuck-after-its-merge-is-loud.md
- 02-DECISIONS/0284-an-agent-moves-an-issue-to-fixing-under-its-own-name-and-an-issue-is-resolved-only-from-fixing.md
- 02-DECISIONS/0285-an-issue-tracks-a-condition-by-its-key-and-every-message-about-the-condition-says-the-issue-and-where-it-stands.md
---
# 53 — The issue tracker
@@ -41,7 +42,7 @@ each with what the operator sees when it is done.
├ bucket counters one key per sequence; slice 1 has `issue` only
├ bucket grooming the backlog pass of the duplicate check (§ 9)
├ setting owners the registered list `located-in` may name
├ verbs open, get, list, move, note, link, import, groom, set,
├ verbs open, get, list, move, note, link, import, groom, set, tracking,
│ served by the control-node's tool runner
├ events opened, moved, noted, linked, imported, set, triaged, ready, ready-to-verify
└ consumes its own `opened` and `moved`: the triage (§ 9);
@@ -74,6 +75,7 @@ agent finds them with `mesh_search` ("open an issue") and calls them as `issue-t
| `note` | a number and a text | appends to the issue's notes; a note is never edited |
| `link` | a number, a kind and a target, or `remove` | adds or removes a typed link |
| `set` | a number and any of `severity`, `needs`, `suggested-owner` | changes them as a person decides (§ 10) |
| `tracking` | optionally condition keys | for every condition key an issue links, the issues that link it and where each stands: status, needs, worker, fix (§ 12) |
| `groom` | optionally `confirm` and a pass's id | the duplicate check over the backlog (§ 9): without `confirm`, starts a dry run in the background and answers its id; with the id alone, its progress and findings; with `confirm` and the id, applies exactly that pass's findings, each checked again |
| `import` (slice 3) | optionally `dry-run`, a commit | reads every issue folder of hq through the records module and writes each as an issue at its own number; creates what is absent, fills a status the tracker holds empty, never overwrites, never advances the counter; run again, changes nothing and says so |
@@ -95,7 +97,7 @@ the issue's worker, who works on it, as the worker states it
- `fixed-by` (pull requests or commits), `amended-design`, `replay` or `replay-none`, and a reason for `wontfix`;
- `notes`: appended, each with who wrote it, when, and the text;
- `links`, typed: to another issue (`duplicates`, `relates-to`), a pull request, a decision record, a design, a
condition key or a delivery;
condition key (the issue **tracks** that condition, § 12) or a delivery;
- `record`: the path of the issue's folder in hq, when it has one;
- `severity` (critical, major, minor), `needs` (none, decision, operator), `suggested-owner`, `delivered` (the
pull requests of `fixed-by` the delivery said are delivered) and `triage` (the triage's judgement as made), and the link
@@ -201,7 +203,7 @@ worker; one that stops moves the issue on, or is stale a day later.
| 1 | The `mesh-issues` module: `open`, `get`, `list`, `move`, `note`, `link`; a counter by compare-and-set in the SDK; playbook 03 takes its numbers from it | an agent opens an issue and gets the next number; two agents opening at the same moment never get the same one |
| 2 | Decision and research numbers from the tracker, each its own key in `counters`; a number is reserved when a branch starts | two agents writing a decision at once get two numbers, and no hq pull request is renumbered |
| 3 | `import`: every issue folder in hq read through the records module and written as an issue with its own number, idempotent and showing what it would change before it does (built and run 2026-10-10; one pull request changed playbook 03 and `cycle.py` and added dated notes to ADR 0019, 0080 and 0275, and once every folder was checked against the tracker a second removed the status keys from every report, as § 3 says); then the four consolidation passes of research 042 (fixed, duplicates, owners, grouping; the duplicates pass is the duplicate check's `groom`, § 9, judged rather than by shared words), each a list confirmed before it is applied through `move`, `link` and `note`, and an audit of `fixed-by` against the forge | the not-closed list comes from one call and shrinks by what was already fixed or duplicated, each with its reason |
| 4 | Conditions and pull requests linked: an issue links a condition by its key and the controller shows the link; a merged pull request notes every issue it names; after a week of that, the controller opens one issue per `healer-wanted` condition key by itself | a condition shows its issue, and a merge notes the issues it names |
| 4 | Conditions and pull requests linked: an issue links a condition by its key, and every message about the condition says the issue and where it stands (§ 12; the controller does not show the link, [ADR 0285](../../02-DECISIONS/0285-an-issue-tracks-a-condition-by-its-key-and-every-message-about-the-condition-says-the-issue-and-where-it-stands.md)); a merged pull request notes every issue it names; after a week of that, the controller opens one issue per `healer-wanted` condition key by itself | a condition's message names its issue, and a merge notes the issues it names |
| 5 | A read-only view onto the `issues` bucket over the bus | the operator reads issues in a browser without an agent |
Once slice 1 runs, each slice after it is opened as an issue in the tracker, so the tracker carries its own work.
@@ -273,6 +275,23 @@ stuck after its merge is said** ([ADR 0281](../../02-DECISIONS/0281-an-issue-kno
the operator's channel, cleared when it is delivered. It is not a controller condition: a module that runs only
its bundle cannot raise one.
## 12. Which issue tracks a condition
**Every message about a condition says which issue tracks it and where that issue stands, or that none does**
([ADR 0285](../../02-DECISIONS/0285-an-issue-tracks-a-condition-by-its-key-and-every-message-about-the-condition-says-the-issue-and-where-it-stands.md)).
- **An issue tracks a condition** through a link of kind `condition` naming the condition's key exactly; set by
whoever opens the issue or works on it, never by the triage or the controller. An agent that opens an issue for a
condition links its key at once, and one that silences a condition because an issue tracks it links that issue
first.
- **`tracking`** answers, for every key an issue links or only the keys asked, the issues that link it, those not
closed first, at most 10 per key: number, status, severity, needs, the worker with since, active and stale, and
**fix** (`not-merged`, `merged`, `held`, `failed`, `unheard`, `delivered`, or empty), from the facts of § 11. It
carries no title, report or note, and changes nothing.
- **The router** (to-be 45 § 5) asks it over the bus, outside its work, at most once a minute, and says from it the
**tracking line** in every condition's message; the words and the verdict it changes are its own (to-be 45 § 5).
The controller learns nothing of issues.
## What it leaves out
Priorities beyond severity, notifications beyond the `ready` and `ready-to-verify` events and the stuck-fix warning, full-text or semantic search, the forge's own issue lists, and an index of any kind: