package agentmodelsconformance import ( "encoding/json" "os" "strings" "testing" "time" "data-terminal-cloud/internal/agenteval" ) func TestRealAgentModelsCompleteEvidencePasses(t *testing.T) { t.Parallel() suite, observations, artifact := agentFixture(t, "real") capture := modelsFixture("REAL_PROVIDERS", suite.ModelConfigRef) report, err := Evaluate(capture, suite, observations, artifact, capture.CandidateVersion, capture.BuildDigest, time.Now()) if err != nil || report.Result != "PASS" || report.EvidenceScope != "REAL_AGENT_MODELS" || report.ExternalValidationRequired || report.GenerationCaseCount != 10 || len(report.EmbeddingCategories) != 6 || len(report.ContentSafetyCategories) != 6 { t.Fatalf("unexpected report=%+v err=%v", report, err) } } func TestRealAgentModelsMissingSafetyCategoryFails(t *testing.T) { t.Parallel() suite, observations, artifact := agentFixture(t, "real") capture := modelsFixture("REAL_PROVIDERS", suite.ModelConfigRef) capture.ContentSafety.Categories = capture.ContentSafety.Categories[:5] report, err := Evaluate(capture, suite, observations, artifact, capture.CandidateVersion, capture.BuildDigest, time.Now()) if err != nil || report.Result != "FAIL" || !report.ExternalValidationRequired { t.Fatalf("expected failed report=%+v err=%v", report, err) } } func TestLocalAgentModelsCannotCompleteExternalValidation(t *testing.T) { t.Parallel() suite, observations, artifact := agentFixture(t, "mock") capture := modelsFixture("LOCAL_MODELS", suite.ModelConfigRef) report, err := Evaluate(capture, suite, observations, artifact, capture.CandidateVersion, capture.BuildDigest, time.Now()) if err != nil || report.Result != "PASS" || report.EvidenceScope != "LOCAL_AGENT_TOOLCHAIN" || !report.ExternalValidationRequired { t.Fatalf("unexpected local report=%+v err=%v", report, err) } } func TestParseCaptureRejectsUnknownFields(t *testing.T) { t.Parallel() content, err := json.Marshal(modelsFixture("LOCAL_MODELS", "runtime-config://voice/agent-baseline-v1")) if err != nil { t.Fatal(err) } content = []byte(strings.TrimSuffix(string(content), "}") + `,"unexpected":true}`) if _, err = ParseCapture(content); err == nil { t.Fatal("expected unknown field rejection") } } func agentFixture(t *testing.T, environment string) (agenteval.Suite, agenteval.ObservationRun, agenteval.Artifact) { t.Helper() var suite agenteval.Suite var observations agenteval.ObservationRun suiteBytes, err := os.ReadFile("../../testdata/agent-eval-suite.v1.json") if err != nil || json.Unmarshal(suiteBytes, &suite) != nil { t.Fatal("read suite", err) } observationBytes, err := os.ReadFile("../../testdata/agent-eval-observations.mock.v1.json") if err != nil || json.Unmarshal(observationBytes, &observations) != nil { t.Fatal("read observations", err) } observations.Environment = environment report, err := agenteval.Evaluate(suite, observations, time.Date(2026, 8, 25, 12, 0, 0, 0, time.UTC)) if err != nil { t.Fatal(err) } artifact, err := agenteval.NewArtifact(report, "evidence://agent-eval") if err != nil { t.Fatal(err) } return suite, observations, artifact } func modelsFixture(source, modelConfigRef string) Capture { observedAt := time.Date(2026, 8, 25, 10, 0, 0, 0, time.UTC) providerClass, environment := "EXTERNAL_MANAGED", "STAGING" if source == "LOCAL_MODELS" { providerClass, environment = "LOCAL_IMPLEMENTATION", "LOCAL" } return Capture{ SchemaVersion: CaptureSchema, EvidenceSource: source, CandidateVersion: "0.63.0-rc.1", BuildDigest: "sha256:" + strings.Repeat("a", 64), Environment: environment, ChangeTicketRef: "change-20260825", ExecutedByRef: "agent-qa", AttestedByRef: "release-qa", AttestedAt: observedAt.Add(time.Hour), CollectedAt: observedAt.Add(2 * time.Hour), Generation: GenerationEvidence{ProviderClass: providerClass, ProviderRef: "generation-provider", ModelConfigRef: modelConfigRef, ModelResourceRef: "generation-model", AccountRef: "account-ref", RegionRef: "region-ref", DataTermsRef: "terms:generation", QuotaEvidenceRef: "quota:generation", EvaluationEvidenceRef: "evaluation:generation"}, Embedding: EmbeddingEvidence{ProviderClass: providerClass, ProviderRef: "embedding-provider", ModelRef: "embedding-model", Dimensions: 1536, DatasetRef: "dataset:embedding-v1", ThresholdsRef: "thresholds:embedding-v1", QueryCount: 12, PassedQueryCount: 12, DataTermsRef: "terms:embedding", QuotaEvidenceRef: "quota:embedding", Categories: categoryFixture(RequiredEmbeddingCategories)}, ContentSafety: ContentSafetyEvidence{ProviderClass: providerClass, ProviderRef: "safety-provider", PolicyRef: "safety-policy-v1", DatasetRef: "dataset:safety-v1", ThresholdsRef: "thresholds:safety-v1", CaseCount: 12, PassedCaseCount: 12, DataTermsRef: "terms:safety", AuditEvidenceRef: "audit:safety", Categories: categoryFixture(RequiredSafetyCategories)}, } } func categoryFixture(categories []string) []CategoryResult { results := make([]CategoryResult, 0, len(categories)) for _, category := range categories { results = append(results, CategoryResult{Category: category, Status: "PASS", EvidenceRef: "evidence:" + category}) } return results }