diff --git a/modules/mesh-delivery-checker/cmd/mesh-delivery-checker/forge.go b/modules/mesh-delivery-checker/cmd/mesh-delivery-checker/forge.go index 1ab1dc0e..95510f85 100644 --- a/modules/mesh-delivery-checker/cmd/mesh-delivery-checker/forge.go +++ b/modules/mesh-delivery-checker/cmd/mesh-delivery-checker/forge.go @@ -5,28 +5,29 @@ import ( "encoding/json" "errors" "fmt" - "regexp" - "strings" "github.com/nats-io/nats.go" + gitseat "git.novox.be/novox/mesh-delivery/contracts/go/seats/git" + "mesh-delivery-checker/internal/check" ) -// The forge's tool the checker reads with (mesh-catalog modules/gitea): gitea_get_file answers {file: {content}}, the text -// of a file at a ref. The checker writes nothing to the forge: the forge bridge sets the statuses (ADR 0484 clause 2). -const getFileTool = "gitea.gitea_get_file" +// The checker reads the forge through the seat git's read verbs (design 47 *The seat git*; milestone 47/G W6.14), as its +// manifest's invokes names them, never by a module's tool: whichever module holds the seat answers. It writes nothing to +// the forge: what the checker owes the forge is the forge bridge's to perform (ADR 0484 clause 2). -// notFoundStatus is the 404 of the forge's error, `Gitea API : `. -var notFoundStatus = regexp.MustCompile(`: 404( |$)`) +// fileVerb is the seat git's verb file, as invokes names it. +var fileVerb = "seat:" + gitseat.Seat + "." + gitseat.VerbFile // forgeReads reads the forge through call (mesh-sdk process.Conn.Call as the checker's own account). type forgeReads struct { call func(key string, body any) (json.RawMessage, error) } -// ask calls a forge tool; a call that reached nobody (no responders: the forge's tool runner re-serving, or the forge -// down) is marked Unheard, so the check fails at the forge and is asked again when the part it could not hear runs (issue 1624). +// ask calls a verb of the seat git; a call that reached nobody (no responders: the holder's tool runner re-serving, or the +// forge down) is marked Unheard, so the check says it could not run and is asked again when the part it could not hear +// runs (issue 1373, issue 1624). func (f forgeReads) ask(key string, body any) (json.RawMessage, error) { raw, err := f.call(key, body) if errors.Is(err, nats.ErrNoResponders) || errors.Is(err, nats.ErrTimeout) || errors.Is(err, context.DeadlineExceeded) { @@ -35,58 +36,24 @@ func (f forgeReads) ask(key string, body any) (json.RawMessage, error) { return raw, err } -func ownerRepo(repository string) (string, string) { - owner, repo, _ := strings.Cut(repository, "/") - return owner, repo -} - -// File is the text of a file of a repository at a ref. +// File is the text of a file of a repository at a ref. A file the forge says the ref does not hold wraps +// check.ErrNotFound (issue 1845); the seat's error is a failure, never an absent file. func (f forgeReads) File(_ context.Context, repository, path, ref string) (string, error) { - owner, repo := ownerRepo(repository) - raw, err := f.ask(getFileTool, map[string]string{"owner": owner, "repo": repo, "path": path, "ref": ref}) + raw, err := f.ask(fileVerb, gitseat.FileInput{Repository: repository, Path: path, Ref: ref}) if err != nil { - if notFoundStatus.MatchString(err.Error()) { - // The forge answers 404 for a file the ref does not hold (issue 1845). The status is matched in its own place, - // after the path's colon: the path carries a sha that may hold the digits 404. - return "", fmt.Errorf("%w: %v", check.ErrNotFound, err) - } return "", err } - var a struct { - File *struct { - Content *string `json:"content"` - } `json:"file"` - } - if err := json.Unmarshal(raw, &a); err != nil || a.File == nil || a.File.Content == nil { - return "", fmt.Errorf("the answer of %s is not {file: {content}}: %v", getFileTool, err) - } - return *a.File.Content, nil -} - -// commitTreesTool lists a commit's files under directories (mesh-catalog modules/gitea): {files: {directory: {path: blob}}}. -const commitTreesTool = "gitea.gitea_commit_trees" - -// Files lists every file under each directory at a commit, relative to it; a directory the commit lacks wraps -// check.ErrNotFound. -func (f forgeReads) Files(_ context.Context, repository, commit string, dirs []string) (map[string]map[string]string, error) { - owner, repo := ownerRepo(repository) - raw, err := f.ask(commitTreesTool, map[string]any{"owner": owner, "repo": repo, "sha": commit, "files": dirs}) - if err != nil { - if strings.Contains(err.Error(), "lacks") || notFoundStatus.MatchString(err.Error()) { - return nil, fmt.Errorf("%w: %v", check.ErrNotFound, err) - } - return nil, err - } - var a struct { - Files map[string]map[string]string `json:"files"` - } + var a gitseat.FileAnswer if err := json.Unmarshal(raw, &a); err != nil { - return nil, fmt.Errorf("the answer of %s is not {files}: %v", commitTreesTool, err) + return "", fmt.Errorf("the answer of %s is not its answer: %v", fileVerb, err) } - for _, d := range dirs { - if _, ok := a.Files[d]; !ok { - return nil, fmt.Errorf("%w: the answer of %s lists no files of %q", check.ErrNotFound, commitTreesTool, d) - } + switch { + case a.Error != "": + return "", fmt.Errorf("%s of %s at %s: %s", fileVerb, path, ref, a.Error) + case a.Absent: + return "", fmt.Errorf("%w: %s holds no %s at %s", check.ErrNotFound, repository, path, ref) + case a.Path == "" && a.Blob == "" && a.Content == "": + return "", fmt.Errorf("the answer of %s names no file and no error", fileVerb) } - return a.Files, nil + return a.Content, nil } diff --git a/modules/mesh-delivery-checker/cmd/mesh-delivery-checker/forge_test.go b/modules/mesh-delivery-checker/cmd/mesh-delivery-checker/forge_test.go index 378b94c6..34382893 100644 --- a/modules/mesh-delivery-checker/cmd/mesh-delivery-checker/forge_test.go +++ b/modules/mesh-delivery-checker/cmd/mesh-delivery-checker/forge_test.go @@ -14,29 +14,43 @@ import ( "mesh-delivery-checker/internal/check" ) -// capturedAnswer is what the forge's tool answered (internal/check/testdata/captured/README). -func capturedAnswer(t *testing.T, name string) json.RawMessage { +// seatAnswer is an answer of the seat git's verb file as its fixtures give it (contracts/seats/git/fixtures/verbs.json). +func seatAnswer(t *testing.T, name string) json.RawMessage { t.Helper() - raw, err := os.ReadFile(filepath.Join("..", "..", "internal", "check", "testdata", "captured", name+".json")) + raw, err := os.ReadFile(filepath.Join("..", "..", "..", "..", "contracts", "seats", "git", "fixtures", "verbs.json")) if err != nil { t.Fatal(err) } - return raw + var fixtures []struct { + Name string `json:"name"` + Of string `json:"of"` + Given json.RawMessage `json:"given"` + } + if err := json.Unmarshal(raw, &fixtures); err != nil { + t.Fatal(err) + } + for _, f := range fixtures { + if f.Of == "verb:file.answer" && strings.Contains(string(f.Given), name) { + return f.Given + } + } + t.Fatalf("no file answer of the seat git's fixtures holds %q", name) + return nil } -func TestTheForgeReadsParseWhatTheForgeAnswered(t *testing.T) { // 1624/AC4 +func TestTheForgeReadsParseWhatTheForgeAnswered(t *testing.T) { // 1624/AC4; milestone 47/G W6.14: through the seat git var asked []string f := forgeReads{call: func(key string, body any) (json.RawMessage, error) { b, _ := json.Marshal(body) asked = append(asked, key+" "+string(b)) - return capturedAnswer(t, "forge-get-file-go-mod"), nil + return seatAnswer(t, "seats/index.json"), nil }} - text, err := f.File(context.Background(), "novox/mesh-delivery", "modules/mesh-delivery-builder/go.mod", "main") - if err != nil || !strings.Contains(text, "git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261021100209-cb54756c3865") { + text, err := f.File(context.Background(), "novox/mesh-contracts", "seats/index.json", "main") + if err != nil || text != `{"format":1,"seats":["mesh-broker"]}` { t.Errorf("file = %q, %v", text, err) } - if len(asked) != 1 || !strings.Contains(asked[0], `"owner":"novox"`) { - t.Errorf("asked %v", asked) + if want := `seat:git.file {"path":"seats/index.json","ref":"main","repository":"novox/mesh-contracts"}`; len(asked) != 1 || asked[0] != want { + t.Errorf("asked %v, want %s", asked, want) } bad := forgeReads{call: func(string, any) (json.RawMessage, error) { return json.RawMessage(`{}`), nil }} if _, err := bad.File(context.Background(), "novox/x", "go.mod", "main"); err == nil { @@ -45,17 +59,17 @@ func TestTheForgeReadsParseWhatTheForgeAnswered(t *testing.T) { // 1624/AC4 } func TestAFileTheRefDoesNotHoldIsNotFoundAndOtherFailuresAreNot(t *testing.T) { // 1845/AC1, AC4 - f := forgeReads{call: func(string, any) (json.RawMessage, error) { - return nil, errors.New("Gitea API contents/checks/particulars/go.mod?ref=98ca97fc: 404 object does not exist") - }} - if _, err := f.File(context.Background(), "novox/mesh-catalog", "checks/particulars/go.mod", "98ca97fc"); !errors.Is(err, check.ErrNotFound) { - t.Errorf("a 404 is %v, want ErrNotFound", err) + f := forgeReads{call: func(string, any) (json.RawMessage, error) { return seatAnswer(t, "seats/gone.json"), nil }} + if _, err := f.File(context.Background(), "novox/mesh-contracts", "seats/gone.json", "aaaa"); !errors.Is(err, check.ErrNotFound) { + t.Errorf("an absent file is %v, want ErrNotFound", err) } - f = forgeReads{call: func(string, any) (json.RawMessage, error) { - return nil, errors.New("Gitea API contents/go.mod?ref=1111111111111111111111111111111404abcde: 500 internal error") - }} + f = forgeReads{call: func(string, any) (json.RawMessage, error) { return seatAnswer(t, "over 512 KiB"), nil }} + if _, err := f.File(context.Background(), "novox/mesh-contracts", "seats/big.json", "main"); err == nil || errors.Is(err, check.ErrNotFound) { + t.Errorf("the seat's error is %v, want a failure that is not ErrNotFound", err) + } + f = forgeReads{call: func(string, any) (json.RawMessage, error) { return nil, errors.New("the holder failed") }} if _, err := f.File(context.Background(), "novox/mesh-catalog", "go.mod", "main"); err == nil || errors.Is(err, check.ErrNotFound) { - t.Errorf("a 500 is %v, want a failure that is not ErrNotFound", err) + t.Errorf("a failed call is %v, want a failure that is not ErrNotFound", err) } } diff --git a/modules/mesh-delivery-checker/cmd/mesh-delivery-checker/integration_test.go b/modules/mesh-delivery-checker/cmd/mesh-delivery-checker/integration_test.go index 5f04fc12..1490cc38 100644 --- a/modules/mesh-delivery-checker/cmd/mesh-delivery-checker/integration_test.go +++ b/modules/mesh-delivery-checker/cmd/mesh-delivery-checker/integration_test.go @@ -36,6 +36,7 @@ import ( "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliverycheckerclient" "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliveryclient" + gitseat "git.novox.be/novox/mesh-delivery/contracts/go/seats/git" "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdeliverychecker" "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/buildrun" @@ -348,43 +349,38 @@ func (f *fakeBuildModules) serve(t *testing.T, module string, kept jetstream.Key go func() { _ = p.Pull(f.ctx) }() } -// serveForge answers the forge's two reads as its tools do, with the answers the forge gave (internal/check/testdata/captured): -// the go.mod of the captured file, whose mesh-sdk pin is cb54756c3865, and gitea_compare for the pin: on the trunk, unless the -// pin is the one the test set as stale. +// serveForge answers the seat git's verb file as its holder does (milestone 47/G W6.14), with the go.mod the forge gave +// (internal/check/testdata/captured), whose mesh-sdk pin is cb54756c3865 unless the test set it as stale, and a member's +// manifest at its head as the bed holds it, else absent. func (b *bed) serveForge(t *testing.T, nc *nats.Conn) { - reply := func(m *nats.Msg, name string) { - var result map[string]any - _ = json.Unmarshal(mustRead(t, name), &result) - answer, _ := json.Marshal(map[string]any{"result": result, "error": "", "node": "n0"}) + var captured struct { + File struct { + Content string `json:"content"` + } `json:"file"` + } + if err := json.Unmarshal(mustRead(t, "forge-get-file-go-mod"), &captured); err != nil { + t.Fatal(err) + } + respond := func(m *nats.Msg, a gitseat.FileAnswer) { + answer, _ := json.Marshal(map[string]any{"result": a, "node": "n0"}) _ = m.Respond(answer) } - for _, tool := range []string{"gitea_get_file", "gitea_compare"} { - tool := tool - sub, err := nc.Subscribe("mesh.mod.gitea.tool."+tool, func(m *nats.Msg) { - var a map[string]string - _ = json.Unmarshal(m.Data, &a) + for _, subject := range []string{"mesh.seat.git.call.file", "mesh.seat.git.call.file.>"} { + sub, err := nc.Subscribe(subject, func(m *nats.Msg) { + var in gitseat.FileInput + _ = json.Unmarshal(m.Data, &in) switch { - case tool == "gitea_get_file" && strings.HasSuffix(a["path"], "module.json"): - // A manifest at a member's head (design 51 *Tagged versions*): the bed's own, else the forge's 404. - if content, ok := b.heads.Load(a["owner"] + "/" + a["repo"] + " " + a["path"] + " " + a["ref"]); ok { - answer, _ := json.Marshal(map[string]any{"result": map[string]any{"file": map[string]any{"content": content}}, "error": "", "node": "n0"}) - _ = m.Respond(answer) + case strings.HasSuffix(in.Path, "module.json"): + // A manifest at a member's head (design 51 *Tagged versions*): the bed's own, else absent. + if content, ok := b.heads.Load(in.Repository + " " + in.Path + " " + in.Ref); ok { + respond(m, gitseat.FileAnswer{Path: in.Path, Ref: in.Ref, Content: content.(string)}) return } - answer, _ := json.Marshal(map[string]any{"result": nil, "error": "Gitea API /repos/x/contents/" + a["path"] + ": 404 Not Found", "node": "n0"}) - _ = m.Respond(answer) - case tool == "gitea_get_file" && b.stalePin.Load(): - content := strings.Replace(string(mustRead(t, "forge-get-file-go-mod")), "cb54756c3865", "9aaa5c80ac5c", 1) - var result map[string]any - _ = json.Unmarshal([]byte(content), &result) - answer, _ := json.Marshal(map[string]any{"result": result, "error": "", "node": "n0"}) - _ = m.Respond(answer) - case tool == "gitea_get_file": - reply(m, "forge-get-file-go-mod") - case strings.HasPrefix(a["head"], "9aaa5c80ac5c"): - reply(m, "forge-compare-branch") + respond(m, gitseat.FileAnswer{Path: in.Path, Ref: in.Ref, Absent: true}) + case b.stalePin.Load(): + respond(m, gitseat.FileAnswer{Path: in.Path, Ref: in.Ref, Content: strings.Replace(captured.File.Content, "cb54756c3865", "9aaa5c80ac5c", 1)}) default: - reply(m, "forge-compare-trunk") + respond(m, gitseat.FileAnswer{Path: in.Path, Ref: in.Ref, Content: captured.File.Content}) } }) if err != nil { diff --git a/modules/mesh-delivery-checker/go.mod b/modules/mesh-delivery-checker/go.mod index 6e83268d..f568baf3 100644 --- a/modules/mesh-delivery-checker/go.mod +++ b/modules/mesh-delivery-checker/go.mod @@ -11,6 +11,7 @@ require ( git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliverycheckerclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliveryclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/contracts/go/seats/git v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdeliverychecker v0.0.0-00010101000000-000000000000 diff --git a/modules/mesh-delivery-checker/internal/check/testdata/captured/README b/modules/mesh-delivery-checker/internal/check/testdata/captured/README index 7df6c1f1..f2b348a3 100644 --- a/modules/mesh-delivery-checker/internal/check/testdata/captured/README +++ b/modules/mesh-delivery-checker/internal/check/testdata/captured/README @@ -13,7 +13,5 @@ FetchResult json.Marshal of mesh-build-node's fetch (fetch.go, preview.go) in it (cmd/mesh-build-node/preview_test.go) at the same commit. Captured on 2026-10-21 for issue 1679. Both clean fetches carry `"programs":[]`, which a merging fetch of the build modules answers since issue 1577 (mesh-sdk buildstep.MergeInto's Programs), added by hand to the captured bytes: a fixture without it is an older build module's, and its line warns that no compiled program is refused. forge-get-file-go-mod.json is the answer of the forge's gitea_get_file (mesh-catalog modules/gitea, tools/index.ts) for modules/mesh-delivery-builder/go.mod of -novox/mesh-delivery at main, and forge-compare-trunk.json the answer of gitea_compare for novox/mesh-sdk base main, head cb54756c3865 (a commit on the -trunk: no commit main does not hold); both called through the mesh on 2026-10-21 for issue 1624. forge-compare-branch.json is the answer of the same call for a -head that is not on the trunk (novox/mesh-sdk base main, head afbe371003a5, the branch feat/r4c5-sdk), shortened to two of its seven commits and one of its -twenty-six files, with the head and the totals set to match. +novox/mesh-delivery at main, called through the mesh on 2026-10-21 for issue 1624; the checker's whole-module test answers its content through the seat +git's verb file (milestone 47/G W6.14). diff --git a/modules/mesh-delivery-checker/internal/check/testdata/captured/forge-compare-branch.json b/modules/mesh-delivery-checker/internal/check/testdata/captured/forge-compare-branch.json deleted file mode 100644 index f8d5829b..00000000 --- a/modules/mesh-delivery-checker/internal/check/testdata/captured/forge-compare-branch.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "base": "main", - "commits": [ - { - "author": "jochen", - "date": "2026-10-21T19:35:14+02:00", - "files": 2, - "sha": "9aaa5c80ac5c4820c4eddf488fbb90ac6981a624", - "subject": "Accept the gate's recheck status mesh/repo-check among the owed contexts, so a pinned recheck is not refused (issue 1673)" - }, - { - "author": "jochen", - "date": "2026-10-21T19:26:02+02:00", - "files": 3, - "sha": "0730ef609216798e787ee8b6542912f5ec613a77", - "subject": "Keep the unit level cheap: the merge's real-git tests start processes, so they are integration tests (issue 895)" - } - ], - "files": [ - { - "path": "go/delivery/gate.go", - "status": "modified" - } - ], - "head": "9aaa5c80ac5c", - "repository": "novox/mesh-sdk", - "said": [ - "9aaa5c80ac5c holds 2 commits main does not, touching 1 files" - ], - "total_commits": 2 -} diff --git a/modules/mesh-delivery-checker/internal/check/testdata/captured/forge-compare-trunk.json b/modules/mesh-delivery-checker/internal/check/testdata/captured/forge-compare-trunk.json deleted file mode 100644 index 21dff8b5..00000000 --- a/modules/mesh-delivery-checker/internal/check/testdata/captured/forge-compare-trunk.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "base": "main", - "commits": [], - "files": [], - "head": "cb54756c3865", - "repository": "novox/mesh-sdk", - "said": [ - "cb54756c3865 holds 0 commits main does not, touching 0 files", - "a file's status is the last listed commit's change to it; for the lines, gitea_pull_request_diff or gitea_get_file" - ], - "total_commits": 0 -} diff --git a/modules/mesh-delivery-checker/manifest_test.go b/modules/mesh-delivery-checker/manifest_test.go index bf7c60c6..da264e05 100644 --- a/modules/mesh-delivery-checker/manifest_test.go +++ b/modules/mesh-delivery-checker/manifest_test.go @@ -125,15 +125,13 @@ func TestManifestDeclarations(t *testing.T) { // 1678/AC1 } // 1887/A5b: the checker reads nothing of the controller's plans-building (ADR 0483 superseded by ADR 0525 §7), calls no // build module's tool and holds no capacity: it puts check asks on the Go and Node build seats (ADR 0525 §1, §4). - // The forge's reads for a mesh-sdk pin (ADR 0484 clause 9), and of the node seat node-engine its one verb - // compose-candidate, asked of every placed node (ADR 0593 §7), never the seat's other verbs. - // The forge's commit trees list a contracts module's seats at a member's head (ADR 0636 §4, headseats.go). - if want := []string{"gitea.gitea_commit_trees", "gitea.gitea_commits", "gitea.gitea_compare", "gitea.gitea_get_file", "gitea.gitea_list_branches", - "mesh-delivery-assigner.assigner_read_assignments", "mesh-delivery-indexer.indexer_read_candidates", "mesh-delivery-indexer.indexer_read_manifests", + // The forge's file read through the seat git, never a module's tool (milestone 47/G W6.14), the build seats' drop, and of + // the node seat node-engine its one verb compose-candidate, asked of every placed node (ADR 0593 §7), never its other verbs. + if want := []string{"mesh-delivery-assigner.assigner_read_assignments", "mesh-delivery-indexer.indexer_read_candidates", "mesh-delivery-indexer.indexer_read_manifests", "mesh-delivery-indexer.indexer_read_modules", "mesh-delivery-indexer.indexer_read_packages", "mesh-delivery-indexer.indexer_read_predefined", "mesh-delivery-indexer.indexer_read_seat_definitions", - "seat:mesh-catalog.revision", "seat:mesh-catalog.seat-definitions", "seat:mesh-config.renames", "seat:mesh-hand-acts.hand-act", "seat:node-build-go.drop", "seat:node-build-node.drop", "seat:node-engine.compose-candidate"}; !reflect.DeepEqual(sorted(m.Invokes), want) { - t.Errorf("invokes = %v, want the forge's reads, the seats' drop and compose-candidate", m.Invokes) + "seat:git.file", "seat:mesh-catalog.revision", "seat:mesh-catalog.seat-definitions", "seat:mesh-config.renames", "seat:mesh-hand-acts.hand-act", "seat:node-build-go.drop", "seat:node-build-node.drop", "seat:node-engine.compose-candidate"}; !reflect.DeepEqual(sorted(m.Invokes), want) { + t.Errorf("invokes = %v, want the seat git's file, the seats' drop and compose-candidate", m.Invokes) } if want := []string{"node-build-go", "node-build-node"}; !reflect.DeepEqual(sorted(m.Uses), want) { t.Errorf("uses = %v, want the Go and Node build seats", m.Uses) diff --git a/modules/mesh-delivery-checker/module.json b/modules/mesh-delivery-checker/module.json index f544c2f8..cc5ebb2c 100644 --- a/modules/mesh-delivery-checker/module.json +++ b/modules/mesh-delivery-checker/module.json @@ -79,11 +79,6 @@ "checker_verdicts" ], "invokes": [ - "gitea.gitea_commit_trees", - "gitea.gitea_commits", - "gitea.gitea_compare", - "gitea.gitea_get_file", - "gitea.gitea_list_branches", "mesh-delivery-assigner.assigner_read_assignments", "mesh-delivery-indexer.indexer_read_candidates", "mesh-delivery-indexer.indexer_read_manifests", @@ -91,6 +86,7 @@ "mesh-delivery-indexer.indexer_read_packages", "mesh-delivery-indexer.indexer_read_predefined", "mesh-delivery-indexer.indexer_read_seat_definitions", + "seat:git.file", "seat:mesh-catalog.revision", "seat:mesh-catalog.seat-definitions", "seat:mesh-config.renames",