mesh-issues: an issue says who works on it, and resolves only from fixing (hq issue 399)
mesh/delivery-group group feat/399-fixing-status checking: 0 of 2 member(s) ready
mesh/merge-gate pass: builds mesh-issues → novox; no bus step; every machine composes with the change as it did without (4 of 4 compose)
mesh/repo-check pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
mesh/delivery superseded: a newer head of the same pull request

Two agents could start on one issue without seeing each other, and an issue
could be resolved without anyone having said they started its fix. A move to
diagnosing or fixing now names by, the worker as who@node; get and list show
the worker with since and stale; another worker is refused while it is
current unless take-over says why (noted); a worker untouched for
worker-stale-after (24h) may be taken over from without a reason. Resolved is
reached only from fixing. The moved event carries by, since and caller.
Fixing counts as not closed for the triage and the duplicate check.
hq ADR 0283.
This commit is contained in:
jochen
2026-10-10 21:04:32 +02:00
parent a14fa306f2
commit 11afde55d6
14 changed files with 648 additions and 72 deletions
+8 -3
View File
@@ -21,17 +21,20 @@ const (
IssueCounter = "issue"
)
// The five statuses of an issue, as the development cycle names them (hq 00-META/checks/cycle.py).
// The six statuses of an issue, as the development cycle names them (hq playbook 03, ADR 0275, ADR 0283).
// Fixing is the status an agent or person moves an issue to when they start its fix; resolved is reached
// only from it (ADR 0283 §3).
const (
StatusOpen = "open"
StatusDiagnosing = "diagnosing"
StatusLocated = "located"
StatusFixing = "fixing"
StatusResolved = "resolved"
StatusWontfix = "wontfix"
)
// Statuses is every status an issue may have, in the order the cycle walks them.
var Statuses = []string{StatusOpen, StatusDiagnosing, StatusLocated, StatusResolved, StatusWontfix}
var Statuses = []string{StatusOpen, StatusDiagnosing, StatusLocated, StatusFixing, StatusResolved, StatusWontfix}
// Severities say how much an issue costs (ADR 0279): critical — something the operator relies on is broken, or
// data is at risk; major — a rule of the mesh does not hold, or people work around it; minor — a contained fix,
@@ -62,7 +65,7 @@ const Unproven = "unproven"
type Issue struct {
Number uint64 `json:"number"`
Title string `json:"title"`
// Status is one of the five. It was empty for an issue opened with a folder in hq before the import of
// Status is one of the six. It was empty for an issue opened with a folder in hq before the import of
// slice 3, whose folder kept its status; the import fills it (to-be 53 §8).
Status string `json:"status,omitempty"`
Report string `json:"report"`
@@ -103,6 +106,8 @@ type Issue struct {
ReadyFor []uint64 `json:"ready-for,omitempty"`
// Triage is the triage's judgement as it was made, kept before it is applied.
Triage *Verdict `json:"triage,omitempty"`
// Worker is who works on it, while it is diagnosing or fixing (ADR 0283); nil at every other status.
Worker *Worker `json:"worker,omitempty"`
// Opening is the id of the call that opened it, so a write whose answer was lost is known as its own.
Opening string `json:"opening"`
// Imported says that the issue, or its status, was taken from its folder in hq by the import of