mesh-knowledge: the import keeps every field and takes clauses only from the Decision section's own list, and can repair what it held (hq issue 487)
mesh/merge-gate pass: builds mesh-knowledge → 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

The import at hq f0892019 lost reconstructed, amended and a research effort's touches, held rests-on only as a
citation, took eight records' clauses from a numbered list inside a ### subsection, and left the 11 records with
no Decision section clause-less with nothing queued. Each is held now; refresh repairs a record only the import
ever wrote, and never one changed since.
This commit is contained in:
2026-10-11 12:18:03 +02:00
parent 300406e0dd
commit 1cc0ab369f
26 changed files with 3592 additions and 80 deletions
@@ -232,6 +232,14 @@ func JudgeRecord(r *Record, held *Entry, lookup Lookup, ref *Reference) []Refusa
if r.Kind != l.To.Kind || !isRecord || l.To.Clause > 0 {
refuse("link-fits", "%s goes from a record to a record of its kind: not %s", l.Kind, l)
}
case l.Kind == LinkRestsOn:
if !decision || l.To.Kind != KindDecision || l.To.Clause > 0 {
refuse("link-fits", "rests-on goes from a decision to a decision it stands on: not %s", l)
}
case l.Kind == LinkTouches:
if r.Kind != KindResearch || l.To.Clause > 0 {
refuse("link-fits", "touches goes from a research effort to a record, an issue or a design: not %s", l)
}
}
if target == nil {
continue
@@ -241,9 +249,9 @@ func JudgeRecord(r *Record, held *Entry, lookup Lookup, ref *Reference) []Refusa
continue
}
switch l.Kind {
case LinkExtends:
case LinkExtends, LinkRestsOn:
if target.Status == StatusSuperseded && !superseders[to] {
refuse("rests-on", "%s extends %s, which is superseded", self, to)
refuse("rests-on", "%s %s %s, which is superseded", self, l.Kind, to)
}
case LinkSupersedes:
if !target.Accepted() || target.Status == StatusSuperseded {
@@ -509,14 +517,14 @@ func JudgeSet(records []*Record) []Finding {
if c := target.Clause(l.To.Clause); c != nil && c.Status != ClauseChanged && c.Status != ClauseSuperseded {
add("partial", fmt.Sprintf("%s changes %s §%d, which is %s", k, to, l.To.Clause, c.Status), k, to)
}
case LinkExtends:
case LinkExtends, LinkRestsOn:
if target.Status == StatusSuperseded {
superseder := false
for _, in := range inbound[to] {
superseder = superseder || (in.l.Kind == LinkSupersedes && in.from.Key() == k)
}
if !superseder {
add("rests-on-live", fmt.Sprintf("%s extends %s, which is superseded", k, to), k, to)
add("rests-on-live", fmt.Sprintf("%s %s %s, which is superseded", k, l.Kind, to), k, to)
}
}
}