mesh-issues and mesh-knowledge: milestones are records of the issue tracker, and progress reads them (ADR 0493 §1 to §4, issue 1781)
mesh/delivery merged: source.main moved to novox/mesh-catalog@5a4ac4991395
mesh/delivery-group group feat/1781-milestone-records merged: every member is merged
mesh/check checking 76e4ec4dc680 on 26908a89506f | novox/mesh-catalog#506 in group feat/1781-milestone-records

mesh-issues keeps each design's milestone in the state milestones (history 5), says milestone-set and
milestone-moved, and serves milestones, milestone-set and milestone-move. An issue's milestone is its own link
of kind milestone, so at most one milestone per issue is checked inside the issue's own write; kind commit
links a fixing commit. The triage links no milestone, pull request or commit. import with milestones=N seeds
a design's table once. mesh-knowledge's progress reads issue-tracker.milestones and its table parse is gone.

Squashed from four commits so the branch history does not carry a compiled bundle that was committed by
mistake (6 MB); the path is now in .gitignore.
This commit is contained in:
2026-10-26 18:42:51 +01:00
parent 26908a8950
commit 76e4ec4dc6
24 changed files with 2912 additions and 196 deletions
@@ -5,8 +5,9 @@ package main
// level, in two forms: minimal, one line per child, cheap enough for every five minutes; detailed, the tree of a
// lead's report with the pull requests, the held groups and what waits on whom, for about every thirty.
//
// It keeps no state of its own. It reads, each a request and reply over the bus: the designs through the records
// module (design.go, cached by hq's commit), the issues from the issue tracker (`issue-tracker.list`, whose rows
// It keeps no state of its own. It reads, each a request and reply over the bus: the designs' titles and states through
// the records module (design.go, cached by hq's commit), their milestones from the issue tracker (milestones.go,
// issue 1781), the issues from the issue tracker (`issue-tracker.list`, whose rows
// say each issue's delivery and when it last moved), and the deliveries and groups from mesh-delivery.
import (
@@ -287,6 +288,9 @@ func milestoneItems(d *Design, rows map[int]trackerRow, missing map[int]bool) ([
}
}
rollUp(&mi, kids)
if m.Status == "closed" && len(kids) == 0 {
mi.State, mi.Why = StateDone, "closed: "+m.Reason
}
mi.Children = kids
items = append(items, mi)
}
@@ -303,9 +307,15 @@ func (k *KB) progressDesign(p *Progress, number int, milestone string) error {
if err != nil {
return err
}
if ds, err = k.withMilestones(ds, number); err != nil {
return err
}
d := ds[0]
p.Source = fmt.Sprintf("the milestone table of %s at hq %s (until the tracker's milestone records, issue 1781)", d.Path, short(commit))
p.Warnings = append(p.Warnings, d.Warnings...)
if len(d.Milestones) == 0 {
return fmt.Errorf("design %d has no milestone records in the issue tracker: seed them from its table with "+
"issue-tracker.import milestones %d", number, number)
}
p.Source = fmt.Sprintf("the issue tracker's milestone records of design %d, and %s at hq %s", number, d.Path, short(commit))
ms := d
if milestone != "" {
m := d.milestone(milestone)
@@ -354,7 +364,10 @@ func (k *KB) progressMesh(p *Progress) error {
if err != nil {
return err
}
p.Source = fmt.Sprintf("the designs in %s at hq %s", DesignsFolder, short(commit))
if ds, err = k.withMilestones(ds, 0); err != nil {
return err
}
p.Source = fmt.Sprintf("the issue tracker's milestone records, and the designs in %s at hq %s", DesignsFolder, short(commit))
var with []*Design
var without []string
for _, d := range ds {