Fix 9.4d: the tool runner's catalog half uses the follower's Ready and lists the entries by fingerprint in its first views

Builds: design 47 G A-103, §614

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
This commit is contained in:
2026-11-12 01:12:29 +01:00
parent 22bff8198c
commit 5bf7a4b656
3 changed files with 25 additions and 15 deletions
+9 -1
View File
@@ -16,6 +16,10 @@ type FirstViewer interface {
Again(ctx context.Context, why string) []error
}
// entryLister is a FirstViewer that also keeps entries by fingerprint (design 47 G A-103): mesh_first_views lists them with their
// state and since when.
type entryLister interface{ Entries() any }
// firstViewsAnswer is mesh_first_views and mesh_first_view_again.
func (s *Surface) firstViewsAnswer(ctx context.Context, name string, args map[string]any) map[string]any {
fv, ok := s.src.(FirstViewer)
@@ -24,7 +28,11 @@ func (s *Surface) firstViewsAnswer(ctx context.Context, name string, args map[st
"another source")
}
if name == verbFirstViews {
return answerText(map[string]any{"first views": fv.Status()})
out := map[string]any{"first views": fv.Status()}
if el, ok := fv.(entryLister); ok {
out["entries"] = el.Entries()
}
return answerText(out)
}
why, _ := args["why"].(string)
if why = strings.TrimSpace(why); why == "" {
@@ -20,6 +20,9 @@ func (v *viewer) Status() []views.Status {
return []views.Status{{Owner: "mesh-delivery-assigner", Tool: "assignments", State: "assignments", Revision: 4, Asks: 1}}
}
// Entries are the entries by fingerprint the viewer keeps (design 47 G A-103).
func (v *viewer) Entries() any { return []string{"fp:a asked"} }
func (v *viewer) Again(_ context.Context, why string) []error {
v.asked = append(v.asked, why)
return nil
@@ -35,7 +38,7 @@ func TestTheConsoleShowsAndAsksAgainTheRunnersFirstViews(t *testing.T) {
v := &viewer{}
var recorded []map[string]any
s := &Surface{src: v, who: "desk.node-tools", Record: func(a map[string]any) error { recorded = append(recorded, a); return nil }}
if got := text(s.discover(context.Background(), "mesh_first_views", nil)); !strings.Contains(got, "mesh-delivery-assigner") || !strings.Contains(got, "assignments") {
if got := text(s.discover(context.Background(), "mesh_first_views", nil)); !strings.Contains(got, "mesh-delivery-assigner") || !strings.Contains(got, "assignments") || !strings.Contains(got, "fp:a asked") {
t.Errorf("mesh_first_views shows %s", got)
}
got := s.discover(context.Background(), "mesh_first_view_again", map[string]any{"why": "doubted"})