From f046bfb9c559b34ec74856200f57f4976c044cc3 Mon Sep 17 00:00:00 2001 From: Jan Svabenik Date: Sat, 21 Mar 2026 20:54:49 +0100 Subject: [PATCH] feat: add analysis level to refinement result --- cmd/sdrd/phase_state_test.go | 2 +- cmd/sdrd/pipeline_runtime.go | 2 +- internal/pipeline/phases.go | 1 + internal/pipeline/phases_test.go | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/cmd/sdrd/phase_state_test.go b/cmd/sdrd/phase_state_test.go index ca22d84..2afb90e 100644 --- a/cmd/sdrd/phase_state_test.go +++ b/cmd/sdrd/phase_state_test.go @@ -10,7 +10,7 @@ func TestPhaseStateCarriesPhaseResults(t *testing.T) { ps := &phaseState{ surveillance: pipeline.SurveillanceResult{NoiseFloor: -90, Scheduled: []pipeline.ScheduledCandidate{{Candidate: pipeline.Candidate{ID: 1}, Priority: 5}}}, refinementInput: pipeline.RefinementInput{Scheduled: []pipeline.ScheduledCandidate{{Candidate: pipeline.Candidate{ID: 1}, Priority: 5}}, SampleRate: 2048000, FFTSize: 2048, CenterHz: 7.1e6}, - refinement: pipeline.RefinementResult{Decisions: []pipeline.SignalDecision{{ShouldRecord: true}}, Candidates: []pipeline.Candidate{{ID: 1}}}, + refinement: pipeline.RefinementResult{Level: pipeline.AnalysisLevel{Name: "refinement"}, Decisions: []pipeline.SignalDecision{{ShouldRecord: true}}, Candidates: []pipeline.Candidate{{ID: 1}}}, } if ps.surveillance.NoiseFloor != -90 || len(ps.surveillance.Scheduled) != 1 { t.Fatalf("unexpected surveillance state: %+v", ps.surveillance) diff --git a/cmd/sdrd/pipeline_runtime.go b/cmd/sdrd/pipeline_runtime.go index de85d79..67288c9 100644 --- a/cmd/sdrd/pipeline_runtime.go +++ b/cmd/sdrd/pipeline_runtime.go @@ -364,7 +364,7 @@ func (rt *dspRuntime) refineSignals(art *spectrumArtifacts, input pipeline.Refin maxDecode := rt.cfg.Resources.MaxDecodeJobs enforceDecisionBudgets(decisions, maxRecord, maxDecode) rt.det.UpdateClasses(signals) - return pipeline.RefinementResult{Signals: signals, Decisions: decisions, Candidates: selectedCandidates} + return pipeline.RefinementResult{Level: input.Level, Signals: signals, Decisions: decisions, Candidates: selectedCandidates} } func (rt *dspRuntime) updateRDS(now time.Time, rec *recorder.Manager, sig *detector.Signal, cls *classifier.Classification) { diff --git a/internal/pipeline/phases.go b/internal/pipeline/phases.go index fb7148f..71a4084 100644 --- a/internal/pipeline/phases.go +++ b/internal/pipeline/phases.go @@ -43,6 +43,7 @@ type RefinementInput struct { } type RefinementResult struct { + Level AnalysisLevel `json:"level"` Signals []detector.Signal `json:"signals"` Decisions []SignalDecision `json:"decisions,omitempty"` Candidates []Candidate `json:"candidates,omitempty"` diff --git a/internal/pipeline/phases_test.go b/internal/pipeline/phases_test.go index 49987df..b062e82 100644 --- a/internal/pipeline/phases_test.go +++ b/internal/pipeline/phases_test.go @@ -8,6 +8,7 @@ import ( func TestRefinementResultCarriesDecisions(t *testing.T) { res := RefinementResult{ + Level: AnalysisLevel{Name: "refinement"}, Signals: []detector.Signal{{ID: 1}}, Decisions: []SignalDecision{{ShouldRecord: true}}, Candidates: []Candidate{{ID: 1}},