From a7b83b27f07d4687bcea3acca2785823a4d04ac5 Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 11 Nov 2026 14:48:07 +0100 Subject: [PATCH] The issue tracker links a research effort by its number (milestone 47/G, W15.2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- modules/mesh-issues/cmd/mesh-issues/check.go | 14 ++++++++++---- modules/mesh-issues/cmd/mesh-issues/main.go | 2 +- .../mesh-issues/cmd/mesh-issues/tracker_test.go | 2 ++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/modules/mesh-issues/cmd/mesh-issues/check.go b/modules/mesh-issues/cmd/mesh-issues/check.go index c657d52b1..0df466e68 100644 --- a/modules/mesh-issues/cmd/mesh-issues/check.go +++ b/modules/mesh-issues/cmd/mesh-issues/check.go @@ -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: diff --git a/modules/mesh-issues/cmd/mesh-issues/main.go b/modules/mesh-issues/cmd/mesh-issues/main.go index d211453d5..e4602f43e 100644 --- a/modules/mesh-issues/cmd/mesh-issues/main.go +++ b/modules/mesh-issues/cmd/mesh-issues/main.go @@ -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.", diff --git a/modules/mesh-issues/cmd/mesh-issues/tracker_test.go b/modules/mesh-issues/cmd/mesh-issues/tracker_test.go index 55c29fc90..77155e53e 100644 --- a/modules/mesh-issues/cmd/mesh-issues/tracker_test.go +++ b/modules/mesh-issues/cmd/mesh-issues/tracker_test.go @@ -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"},