From 7c84fe7dcfbc9ca01e6e5fb9e2ead2236241ed57 Mon Sep 17 00:00:00 2001 From: michelle-clayton-work Date: Fri, 16 Oct 2026 11:32:42 -0700 Subject: [PATCH 1/2] Record FileAccess experimental exclusions Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- _catalog/dotnet-go-sdk-symbol-mapping.json | 80 +++++++++++----------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/_catalog/dotnet-go-sdk-symbol-mapping.json b/_catalog/dotnet-go-sdk-symbol-mapping.json index 3026cb3d..56ddea90 100644 --- a/_catalog/dotnet-go-sdk-symbol-mapping.json +++ b/_catalog/dotnet-go-sdk-symbol-mapping.json @@ -13310,90 +13310,90 @@ "mapping": { "go": "", "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProvider is marked MAAI001 experimental." }, "properties": { "AllToolsAutoApprovalRule": { "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProvider is marked MAAI001 experimental." }, "ReadOnlyToolsAutoApprovalRule": { "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProvider is marked MAAI001 experimental." }, "StateKeys": { "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProvider is marked MAAI001 experimental." } }, "methods": { "Dispose() -> void": { "go": "", "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProvider is marked MAAI001 experimental." } }, "constructors": { "FileAccessProvider(AgentFileStore, FileAccessProviderOptions)": { "go": "", "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProvider is marked MAAI001 experimental." } }, "constants": { "DeleteFileToolName": { "go": "", "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProvider is marked MAAI001 experimental." }, "GrepToolName": { "go": "", "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProvider is marked MAAI001 experimental." }, "LsToolName": { "go": "", "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProvider is marked MAAI001 experimental." }, "ReadFileToolName": { "go": "", "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProvider is marked MAAI001 experimental." }, "ReadLinesToolName": { "go": "", "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProvider is marked MAAI001 experimental." }, "ReplaceLinesToolName": { "go": "", "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProvider is marked MAAI001 experimental." }, "ReplaceToolName": { "go": "", "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProvider is marked MAAI001 experimental." }, "WriteToolName": { "go": "", "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProvider is marked MAAI001 experimental." } } }, @@ -13404,37 +13404,37 @@ "mapping": { "go": "", "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProviderOptions is marked MAAI001 experimental." }, "properties": { "DisableReadOnlyToolApproval": { "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProviderOptions is marked MAAI001 experimental." }, "DisableWriteToolApproval": { "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProviderOptions is marked MAAI001 experimental." }, "DisableWriteTools": { "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProviderOptions is marked MAAI001 experimental." }, "Instructions": { "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProviderOptions is marked MAAI001 experimental." } }, "constructors": { "FileAccessProviderOptions()": { "go": "", "go_symbols": [], - "status": "unmapped", - "unreviewed": true + "status": "intentional", + "note": "Intentionally omitted from the Go 0.2.0 non-experimental harness scope because FileAccessProviderOptions is marked MAAI001 experimental." } } }, From 6abc2cc2443c39b6e3c04c52fe8a2660021e647c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 16 Oct 2026 18:42:56 +0000 Subject: [PATCH 2/2] Fix unchecked errors in tests Co-authored-by: michelle-clayton-work <262183035+michelle-clayton-work@users.noreply.github.com> --- agent/context_test.go | 5 +- agent/logger_test.go | 5 +- provider/openaiprovider/chat_test.go | 4 +- provider/otelprovider/otel_test.go | 74 +++++++++++++++---- vectordata/helpers_test.go | 10 ++- workflow/agentworkflow/hosting_test.go | 5 +- workflow/agentworkflow/workflow_test.go | 5 +- .../internal/execution/eventstream_test.go | 5 +- 8 files changed, 91 insertions(+), 22 deletions(-) diff --git a/agent/context_test.go b/agent/context_test.go index 09960fd1..2e6cf44c 100644 --- a/agent/context_test.go +++ b/agent/context_test.go @@ -305,7 +305,10 @@ func TestContextProviderMiddleware_Run_SuppressesInvokedErrorAfterConsumerStop(t // returns an error; the middleware must not yield it because the consumer // already stopped, otherwise Go panics with // "range function continued iteration after loop body returned false". - for range seq { + for _, err := range seq { + if err != nil { + t.Fatalf("middleware returned an error: %v", err) + } break } } diff --git a/agent/logger_test.go b/agent/logger_test.go index 3c70f1de..a107c13d 100644 --- a/agent/logger_test.go +++ b/agent/logger_test.go @@ -164,7 +164,10 @@ func TestAgent_RunLogs_EarlyTermination(t *testing.T) { }) consumedCount := 0 - for range a.RunText(context.Background(), "hello") { + for _, err := range a.RunText(context.Background(), "hello") { + if err != nil { + t.Fatal(err) + } consumedCount++ if consumedCount >= 2 { break diff --git a/provider/openaiprovider/chat_test.go b/provider/openaiprovider/chat_test.go index 30f2e972..fd5fa012 100644 --- a/provider/openaiprovider/chat_test.go +++ b/provider/openaiprovider/chat_test.go @@ -694,7 +694,9 @@ func TestChatAgentConfigAllowsConcurrentToolInvocation(t *testing.T) { case <-started: case <-time.After(time.Second): close(release) - <-done + if err := <-done; err != nil { + t.Errorf("tool run after releasing calls: %v", err) + } t.Fatal("tool calls did not start concurrently") } } diff --git a/provider/otelprovider/otel_test.go b/provider/otelprovider/otel_test.go index 90700f91..694e4877 100644 --- a/provider/otelprovider/otel_test.go +++ b/provider/otelprovider/otel_test.go @@ -223,7 +223,10 @@ func TestOtel_Run_DoesNotRecordUnreportedTokenUsage(t *testing.T) { } } - for range mw.Run(next, t.Context(), nil) { + for _, err := range mw.Run(next, t.Context(), nil) { + if err != nil { + t.Fatal(err) + } } resourceMetrics := collectMetrics(t, reader) @@ -244,7 +247,10 @@ func TestOtel_Run_DoesNotRecordEmptyUsageContent(t *testing.T) { } } - for range mw.Run(next, t.Context(), nil) { + for _, err := range mw.Run(next, t.Context(), nil) { + if err != nil { + t.Fatal(err) + } } resourceMetrics := collectMetrics(t, reader) @@ -267,7 +273,10 @@ func TestOtel_Run_DoesNotRecordTokenMetricForOptionalCountersOnly(t *testing.T) } } - for range mw.Run(next, t.Context(), nil) { + for _, err := range mw.Run(next, t.Context(), nil) { + if err != nil { + t.Fatal(err) + } } resourceMetrics := collectMetrics(t, reader) @@ -288,7 +297,10 @@ func TestOtel_Run_MetricErrorAttributes(t *testing.T) { } } - for range mw.Run(next, t.Context(), nil) { + for _, err := range mw.Run(next, t.Context(), nil) { + if !errors.Is(err, testErr) { + t.Fatalf("middleware error = %v, want %v", err, testErr) + } } resourceMetrics := collectMetrics(t, reader) @@ -339,7 +351,10 @@ func TestOtel_Run_RecordsMetricsOnEarlyBreak(t *testing.T) { } } - for range mw.Run(next, t.Context(), nil) { + for _, err := range mw.Run(next, t.Context(), nil) { + if err != nil { + t.Fatal(err) + } break } @@ -368,7 +383,10 @@ func TestOtel_Run_CreatesSpan(t *testing.T) { messages := []*message.Message{message.NewText("test message")} seq := mw.Run(next, t.Context(), messages) - for range seq { + for _, err := range seq { + if err != nil { + t.Fatal(err) + } } if !nextCalled { @@ -592,7 +610,10 @@ func TestOtel_Run_RecordsError(t *testing.T) { messages := []*message.Message{message.NewText("test message")} seq := mw.Run(next, t.Context(), messages) - for range seq { + for _, err := range seq { + if !errors.Is(err, testErr) { + t.Fatalf("middleware error = %v, want %v", err, testErr) + } } spans := exporter.GetSpans() @@ -647,7 +668,10 @@ func TestOtel_Run_CustomSourceName(t *testing.T) { } seq := mw.Run(next, t.Context(), []*message.Message{}) - for range seq { + for _, err := range seq { + if err != nil { + t.Fatal(err) + } } spans := exporter.GetSpans() @@ -673,7 +697,10 @@ func TestOtel_Run_DefaultSourceName(t *testing.T) { } seq := mw.Run(next, t.Context(), []*message.Message{}) - for range seq { + for _, err := range seq { + if err != nil { + t.Fatal(err) + } } spans := exporter.GetSpans() @@ -701,7 +728,10 @@ func TestOtel_Run_PropagatesContext(t *testing.T) { } seq := mw.Run(next, t.Context(), []*message.Message{}) - for range seq { + for _, err := range seq { + if err != nil { + t.Fatal(err) + } } if capturedCtx == nil { @@ -737,7 +767,10 @@ func TestOtel_Run_HandlesMultipleUpdates(t *testing.T) { } seq := mw.Run(next, t.Context(), []*message.Message{}) - for range seq { + for _, err := range seq { + if err != nil { + t.Fatal(err) + } updateCount++ } @@ -980,7 +1013,10 @@ func TestOtel_Run_HandlesEarlyBreak(t *testing.T) { seq := mw.Run(next, t.Context(), []*message.Message{}) count := 0 - for range seq { + for _, err := range seq { + if err != nil { + t.Fatal(err) + } count++ if count >= 3 { break @@ -1011,7 +1047,10 @@ func TestOtel_Run_UnknownProviderWhenNoMetadata(t *testing.T) { // Use context without metadata seq := mw.Run(next, t.Context(), []*message.Message{}) - for range seq { + for _, err := range seq { + if err != nil { + t.Fatal(err) + } } spans := exporter.GetSpans() @@ -1049,7 +1088,14 @@ func TestOtel_Run_RecordsMultipleErrors(t *testing.T) { } seq := mw.Run(next, t.Context(), []*message.Message{}) - for range seq { + wantErrors := []error{err1, err2} + for _, err := range seq { + if callCount >= len(wantErrors) { + t.Fatalf("received more than %d errors", len(wantErrors)) + } + if !errors.Is(err, wantErrors[callCount]) { + t.Errorf("error %d = %v, want %v", callCount, err, wantErrors[callCount]) + } callCount++ } diff --git a/vectordata/helpers_test.go b/vectordata/helpers_test.go index e140c9e1..5ddc4b1d 100644 --- a/vectordata/helpers_test.go +++ b/vectordata/helpers_test.go @@ -204,7 +204,10 @@ func TestGetBatch_NativeStopsOnConsumerBreakAndError(t *testing.T) { } } }} - for range vectordata.GetBatch(t.Context(), collection, []string{"first", "second"}, nil) { + for _, err := range vectordata.GetBatch(t.Context(), collection, []string{"first", "second"}, nil) { + if !errors.Is(err, failure) { + t.Fatalf("GetBatch error = %v, want %v", err, failure) + } break } if calls != 1 { @@ -216,7 +219,10 @@ func TestGetBatch_NativeStopsOnConsumerBreakAndError(t *testing.T) { func TestBatchHelpers_EmptyAndInvalidInputs(t *testing.T) { collection := &nativeCollection{} for _, keys := range [][]string{nil, {}} { - for range vectordata.GetBatch(t.Context(), collection, keys, nil) { + for _, err := range vectordata.GetBatch(t.Context(), collection, keys, nil) { + if err != nil { + t.Fatal(err) + } t.Fatal("empty retrieval yielded a value") } if err := vectordata.DeleteBatch(t.Context(), collection, keys); err != nil { diff --git a/workflow/agentworkflow/hosting_test.go b/workflow/agentworkflow/hosting_test.go index 52a4b2bf..9c22eb45 100644 --- a/workflow/agentworkflow/hosting_test.go +++ b/workflow/agentworkflow/hosting_test.go @@ -748,7 +748,10 @@ func TestHostedAgent_ForwardsIncomingMessages(t *testing.T) { }} sendStreamMessage(t, stream, ctx, input) sendStreamMessage(t, stream, ctx, workflow.TurnToken{}) - for range stream.WatchStream(ctx) { + for _, err := range stream.WatchStream(ctx) { + if err != nil { + t.Fatal(err) + } } // First call: incoming forwarded message (only when forwarding is enabled). diff --git a/workflow/agentworkflow/workflow_test.go b/workflow/agentworkflow/workflow_test.go index 9860be27..073567d9 100644 --- a/workflow/agentworkflow/workflow_test.go +++ b/workflow/agentworkflow/workflow_test.go @@ -800,7 +800,10 @@ func TestNew_IncludeOutputsInResponse(t *testing.T) { } var updates int - for range ag.RunText(t.Context(), "ping", agent.Stream(true)) { + for _, err := range ag.RunText(t.Context(), "ping", agent.Stream(true)) { + if err != nil { + t.Fatal(err) + } updates++ } // Streaming keeps both the hosted update and the translated workflow output visible. diff --git a/workflow/internal/execution/eventstream_test.go b/workflow/internal/execution/eventstream_test.go index 4a83b203..9d0dc2e2 100644 --- a/workflow/internal/execution/eventstream_test.go +++ b/workflow/internal/execution/eventstream_test.go @@ -389,7 +389,10 @@ func TestLockstepRunEventStream_EarlyStopEndsWorkflowRunSpan(t *testing.T) { stream := newLockstepRunEventStream(runner) defer stream.Stop() - for range stream.TakeEventStream(t.Context(), false) { + for _, err := range stream.TakeEventStream(t.Context(), false) { + if err != nil { + t.Fatal(err) + } break }