From 1025001f20da2a5954ceea2e59fcc4da86640e3e Mon Sep 17 00:00:00 2001 From: Eric Rakestraw Date: Thu, 27 Aug 2026 16:54:05 +0000 Subject: [PATCH] Complete diagnostic migration verification --- docs/roadmap/implementation.md | 2 +- internal/cli/run_terminal.go | 6 +++++- internal/cli/state_hardening_test.go | 6 +++--- internal/core/debugbundle/summary.go | 22 +++++++++++++--------- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/docs/roadmap/implementation.md b/docs/roadmap/implementation.md index 712a4232..3c9a203a 100644 --- a/docs/roadmap/implementation.md +++ b/docs/roadmap/implementation.md @@ -669,7 +669,7 @@ modules without duplicating public schemas. This stage is appropriately sized for one `gpt-5.6-terra` prompt. -## Stage 13 — Final Behavioral Verification And Cleanup +## Stage 13 ✅ — Final Behavioral Verification And Cleanup ### Goal diff --git a/internal/cli/run_terminal.go b/internal/cli/run_terminal.go index e4d2ea36..084cfe1b 100644 --- a/internal/cli/run_terminal.go +++ b/internal/cli/run_terminal.go @@ -39,7 +39,11 @@ func (s *pipelineCommandState) observeOutput(output pipeline.RunOutput) { } s.report.OutputCount = len(output.NormalizeOutputs) s.report.RejectedCount = len(output.Rejected) - s.report.WarningCount = warningGroupCount(output.Diagnostics) + s.report.WarningGroupCount = warningGroupCount(output.Diagnostics) + s.report.WarningOccurrenceCount = warningOccurrenceCount(output.Diagnostics) + s.report.DiagnosticGroupCount = diagnosticGroupCount(output.Diagnostics) + s.report.DiagnosticOccurrenceCount = diagnosticOccurrenceCount(output.Diagnostics) + s.report.DiagnosticsTruncated = output.Diagnostics.Truncated s.report.ValidationStatus = output.Manifest.ValidationStatus } diff --git a/internal/cli/state_hardening_test.go b/internal/cli/state_hardening_test.go index ee3806d6..fcaf7e49 100644 --- a/internal/cli/state_hardening_test.go +++ b/internal/cli/state_hardening_test.go @@ -349,7 +349,7 @@ func TestRunUsesOneInjectedIdentityForDebugOutputAndManifest(t *testing.T) { t.Fatalf("debug invocation session = %q, want %q", invocation.SessionID, wantSessionID) } report := readStateTestRunReport(t, debugPath) - if !report.Succeeded || report.RunID != runID || report.PipelineID != "sample" || report.OutputPath != outputPath || report.DebugPath != debugPath || report.OutputCount != 1 || report.RejectedCount != 0 || report.WarningCount != 0 || report.ValidationStatus != "approved" { + if !report.Succeeded || report.RunID != runID || report.PipelineID != "sample" || report.OutputPath != outputPath || report.DebugPath != debugPath || report.OutputCount != 1 || report.RejectedCount != 0 || report.WarningGroupCount != 0 || report.WarningOccurrenceCount != 0 || report.DiagnosticGroupCount != 0 || report.DiagnosticOccurrenceCount != 0 || report.DiagnosticsTruncated || report.ValidationStatus != "approved" { t.Fatalf("success report = %#v", report) } if !strings.Contains(result.stdout, "outputs=1 rejected=0") { @@ -431,7 +431,7 @@ func TestRunWritesTerminalArtifactsForResolutionPipelineAndOutputFailures(t *tes bundlePath := onlyChildDir(t, roots.debug) runID := filepath.Base(bundlePath) report := readStateTestRunReport(t, bundlePath) - if report.Succeeded || report.RunID != runID || report.PipelineID != tc.pipelineID || report.OutputPath != filepath.Join(roots.output, runID) || report.DebugPath != bundlePath || report.OutputCount != tc.wantOutputs || report.RejectedCount != 0 || report.WarningCount != 0 || report.ValidationStatus != tc.wantValidation { + if report.Succeeded || report.RunID != runID || report.PipelineID != tc.pipelineID || report.OutputPath != filepath.Join(roots.output, runID) || report.DebugPath != bundlePath || report.OutputCount != tc.wantOutputs || report.RejectedCount != 0 || report.WarningGroupCount != 0 || report.WarningOccurrenceCount != 0 || report.DiagnosticGroupCount != 0 || report.DiagnosticOccurrenceCount != 0 || report.DiagnosticsTruncated || report.ValidationStatus != tc.wantValidation { t.Fatalf("failure report = %#v", report) } errorLog, err := os.ReadFile(filepath.Join(bundlePath, "summary", "error.log")) @@ -454,7 +454,7 @@ func TestRunRetainsPartialPipelineOutcomeInFailureSummary(t *testing.T) { } bundlePath := onlyChildDir(t, roots.debug) report := readStateTestRunReport(t, bundlePath) - if report.Succeeded || report.OutputCount != 0 || report.RejectedCount != 0 || report.WarningCount != 1 || report.ValidationStatus != "failed" { + if report.Succeeded || report.OutputCount != 0 || report.RejectedCount != 0 || report.WarningGroupCount != 1 || report.WarningOccurrenceCount != 1 || report.DiagnosticGroupCount != 0 || report.DiagnosticOccurrenceCount != 0 || report.DiagnosticsTruncated || report.ValidationStatus != "failed" { t.Fatalf("partial failure report = %#v", report) } diff --git a/internal/core/debugbundle/summary.go b/internal/core/debugbundle/summary.go index b6b8eb42..9c31363f 100644 --- a/internal/core/debugbundle/summary.go +++ b/internal/core/debugbundle/summary.go @@ -45,15 +45,19 @@ type Invocation struct { StartedAt time.Time `json:"started_at"` } type RunReport struct { - RunID string `json:"run_id"` - PipelineID string `json:"pipeline_id"` - OutputPath string `json:"output_path,omitempty"` - DebugPath string `json:"debug_path,omitempty"` - Succeeded bool `json:"succeeded"` - OutputCount int `json:"output_count"` - RejectedCount int `json:"rejected_count"` - WarningCount int `json:"warning_count"` - ValidationStatus string `json:"validation_status,omitempty"` + RunID string `json:"run_id"` + PipelineID string `json:"pipeline_id"` + OutputPath string `json:"output_path,omitempty"` + DebugPath string `json:"debug_path,omitempty"` + Succeeded bool `json:"succeeded"` + OutputCount int `json:"output_count"` + RejectedCount int `json:"rejected_count"` + WarningGroupCount int `json:"warning_group_count"` + WarningOccurrenceCount int `json:"warning_occurrence_count"` + DiagnosticGroupCount int `json:"diagnostic_group_count"` + DiagnosticOccurrenceCount int `json:"diagnostic_occurrence_count"` + DiagnosticsTruncated bool `json:"diagnostics_truncated"` + ValidationStatus string `json:"validation_status,omitempty"` } type SummaryWriter struct { root, runID string