The issue tracker links a research effort by its number (milestone 47/G, W15.2)

The trace from research to the running build is links all the way (design 47).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

(Joined from dd68c96d.)
Builds: design 47 G §318 (ISS1)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
This commit is contained in:
2026-11-11 14:48:07 +01:00
parent 4839884d93
commit a7b83b27f0
3 changed files with 13 additions and 5 deletions
+10 -4
View File
@@ -212,9 +212,12 @@ const (
LinkDependsOn = "depends-on"
LinkPullRequest = "pull-request"
LinkDecision = "decision"
LinkDesign = "design"
LinkCondition = "condition"
LinkDelivery = "delivery"
// LinkResearch is a research effort of the knowledge base, by its number (design 47: the trace from research to the
// running build is links all the way).
LinkResearch = "research"
LinkDesign = "design"
LinkCondition = "condition"
LinkDelivery = "delivery"
// LinkMilestone is the one milestone an issue belongs to, design/id (ADR 0493 §1, §2).
LinkMilestone = "milestone"
// LinkCommit is a commit that fixes the issue, repository@full sha (ADR 0493 §4).
@@ -222,7 +225,7 @@ const (
)
// LinkKinds is every kind, in the order they are told.
var LinkKinds = []string{LinkDuplicates, LinkRelatesTo, LinkDependsOn, LinkPullRequest, LinkDecision, LinkDesign, LinkCondition, LinkDelivery,
var LinkKinds = []string{LinkDuplicates, LinkRelatesTo, LinkDependsOn, LinkPullRequest, LinkDecision, LinkResearch, LinkDesign, LinkCondition, LinkDelivery,
LinkMilestone, LinkCommit}
// madeByPeople are the kinds only a person or a session links, never the triage (ADR 0493 §4).
@@ -231,6 +234,7 @@ var madeByPeople = []string{LinkPullRequest, LinkMilestone, LinkCommit}
var (
pullRequest = regexp.MustCompile(`^[a-z0-9][a-z0-9._-]{0,99}#[1-9][0-9]{0,6}$`)
decision = regexp.MustCompile(`^[0-9]{4}$`)
research = regexp.MustCompile(`^[0-9]{3,4}$`)
// deliveryID mirrors the delivery gate's `IDOf` (modules/mesh-delivery-gate/cmd/mesh-delivery-gate/model.go): the forge's
// repository as owner/name, lower-cased, `@` and at most twelve characters of its commit. The pattern this
// replaced took neither the slash nor the `@`, so no delivery could be linked (novox/hq issue 475).
@@ -280,6 +284,8 @@ func checkTarget(kind, target string) (string, error) {
ok, shape = pullRequest.MatchString(t), "a repository and a pull request's number, such as mesh-host#246"
case LinkDecision:
ok, shape = decision.MatchString(t), "a decision record's four-digit number, such as 0275"
case LinkResearch:
ok, shape = research.MatchString(t), "a research effort's number, such as 085"
case LinkDesign:
ok, shape = designPath.MatchString(t), "a design document, such as 03-DESIGN/01-to-be/53-the-issue-tracker.md"
case LinkCondition:
+1 -1
View File
@@ -616,7 +616,7 @@ func Tools(t *Tracker) []stdio.Tool {
{Name: Seat + ".link",
Description: "Link an issue to something, or with remove, take a link away. Kinds: duplicates or relates-to " +
"another issue (its number), pull-request (such as mesh-host#246), decision (a decision record's " +
"number, such as 0275), design (a design document's path), condition (a condition's key) and delivery " +
"number, such as 0275), research (a research effort's number, such as 085), design (a design document's path), condition (a condition's key) and delivery " +
"(a delivery's id, such as novox/mesh-host@d2e9dc61590f), milestone (the one milestone it belongs to, design/id such as " +
"47/R6) and commit (a commit that fixes it, repository@full sha). Refused: a target not of its kind's shape, an issue that does not exist, a link it " +
"already has, a second milestone (remove the first to move it), a milestone that does not exist or is closed.",
@@ -485,6 +485,7 @@ func TestLinksAreTypedAddedOnceAndRemoved(t *testing.T) {
{Kind: LinkRelatesTo, Target: keyOf(b)},
{Kind: LinkPullRequest, Target: "mesh-controller#246"},
{Kind: LinkDecision, Target: "0275"},
{Kind: LinkResearch, Target: "085"},
{Kind: LinkDesign, Target: "03-DESIGN/01-to-be/53-the-issue-tracker.md"},
{Kind: LinkCondition, Target: "mesh.hand-acts.backup.healer-wanted"},
{Kind: LinkDelivery, Target: "novox/mesh-controller@0f853e93fa11"},
@@ -505,6 +506,7 @@ func TestLinksAreTypedAddedOnceAndRemoved(t *testing.T) {
{LinkAsk{Kind: LinkPullRequest, Target: "mesh-controller#246"}, "already has"},
{LinkAsk{Kind: LinkPullRequest, Target: "../x#1"}, "target is"},
{LinkAsk{Kind: LinkDecision, Target: "275"}, "four-digit"},
{LinkAsk{Kind: LinkResearch, Target: "85"}, "research effort's number"},
{LinkAsk{Kind: LinkDesign, Target: "03-DESIGN/../../etc/passwd"}, "design document"},
{LinkAsk{Kind: LinkCondition, Target: "a key\nwith a line"}, "condition"},
{LinkAsk{Kind: LinkCondition, Target: "machine.ace.token=abcdefgh123.leaked"}, "secret"},