Skip to content

Commit 87d8b4b

Browse files
committed
Auto-commit
1 parent 9cabab0 commit 87d8b4b

File tree

7 files changed

+2916
-0
lines changed

7 files changed

+2916
-0
lines changed

challenges/scripts/multipass_validation_challenge.sh

Lines changed: 406 additions & 0 deletions
Large diffs are not rendered by default.

internal/services/debate_dialogue.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,13 @@ const (
530530
EventActEnd DialogueEventType = "act_end"
531531
EventEpilogue DialogueEventType = "epilogue"
532532
EventConsensus DialogueEventType = "consensus"
533+
// Multi-pass validation phase events
534+
EventPhaseStart DialogueEventType = "phase_start"
535+
EventPhaseProgress DialogueEventType = "phase_progress"
536+
EventPhaseEnd DialogueEventType = "phase_end"
537+
EventValidationResult DialogueEventType = "validation_result"
538+
EventPolishResult DialogueEventType = "polish_result"
539+
EventFinalSynthesis DialogueEventType = "final_synthesis"
533540
)
534541

535542
// DialogueStream provides streaming dialogue events
@@ -599,7 +606,41 @@ func FormatEventAsText(event *DialogueEvent) string {
599606
return event.Content
600607
case EventConsensus:
601608
return fmt.Sprintf("\n╔══ CONSENSUS ══╗\n%s\n╚═══════════════╝\n", event.Content)
609+
// Multi-pass validation phase events
610+
case EventPhaseStart:
611+
return fmt.Sprintf("\n%s\n%s\n%s\n",
612+
strings.Repeat("═", 70),
613+
event.Content,
614+
strings.Repeat("═", 70))
615+
case EventPhaseProgress:
616+
return fmt.Sprintf(" ▸ %s\n", event.Content)
617+
case EventPhaseEnd:
618+
return fmt.Sprintf("\n%s\n[Phase Complete]\n%s\n",
619+
strings.Repeat("─", 70),
620+
strings.Repeat("─", 70))
621+
case EventValidationResult:
622+
return fmt.Sprintf(" ✓ Validation: %s\n", event.Content)
623+
case EventPolishResult:
624+
return fmt.Sprintf(" ✨ Polish: %s\n", event.Content)
625+
case EventFinalSynthesis:
626+
return fmt.Sprintf(`
627+
╔══════════════════════════════════════════════════════════════════════════════╗
628+
║ 📜 FINAL CONCLUSION 📜 ║
629+
╠══════════════════════════════════════════════════════════════════════════════╣
630+
%s
631+
╚══════════════════════════════════════════════════════════════════════════════╝
632+
`, event.Content)
602633
default:
603634
return event.Content
604635
}
605636
}
637+
638+
// DialogueEvent extension fields for multi-pass validation
639+
type PhaseEventData struct {
640+
Phase string `json:"phase,omitempty"`
641+
PhaseOrder int `json:"phase_order,omitempty"`
642+
PhaseIcon string `json:"phase_icon,omitempty"`
643+
ValidationScore float64 `json:"validation_score,omitempty"`
644+
PolishScore float64 `json:"polish_score,omitempty"`
645+
Confidence float64 `json:"confidence,omitempty"`
646+
}

internal/services/debate_dialogue_test.go

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,96 @@ func TestFormatEventAsText(t *testing.T) {
631631
assert.Contains(t, result, "CONSENSUS")
632632
assert.Contains(t, result, "Final answer")
633633
})
634+
635+
// Multi-pass validation phase events
636+
t.Run("Formats phase start event", func(t *testing.T) {
637+
event := &DialogueEvent{Type: EventPhaseStart, Content: "PHASE 1: INITIAL RESPONSE"}
638+
result := FormatEventAsText(event)
639+
assert.Contains(t, result, "PHASE 1")
640+
assert.Contains(t, result, "═")
641+
})
642+
643+
t.Run("Formats phase progress event", func(t *testing.T) {
644+
event := &DialogueEvent{Type: EventPhaseProgress, Content: "Processing responses..."}
645+
result := FormatEventAsText(event)
646+
assert.Contains(t, result, "▸")
647+
assert.Contains(t, result, "Processing responses")
648+
})
649+
650+
t.Run("Formats phase end event", func(t *testing.T) {
651+
event := &DialogueEvent{Type: EventPhaseEnd, Content: "Phase complete"}
652+
result := FormatEventAsText(event)
653+
assert.Contains(t, result, "Phase Complete")
654+
assert.Contains(t, result, "─")
655+
})
656+
657+
t.Run("Formats validation result event", func(t *testing.T) {
658+
event := &DialogueEvent{Type: EventValidationResult, Content: "Score: 0.85"}
659+
result := FormatEventAsText(event)
660+
assert.Contains(t, result, "✓")
661+
assert.Contains(t, result, "Validation")
662+
assert.Contains(t, result, "Score")
663+
})
664+
665+
t.Run("Formats polish result event", func(t *testing.T) {
666+
event := &DialogueEvent{Type: EventPolishResult, Content: "Improved by 15%"}
667+
result := FormatEventAsText(event)
668+
assert.Contains(t, result, "✨")
669+
assert.Contains(t, result, "Polish")
670+
assert.Contains(t, result, "15%")
671+
})
672+
673+
t.Run("Formats final synthesis event", func(t *testing.T) {
674+
event := &DialogueEvent{Type: EventFinalSynthesis, Content: "Synthesized conclusion"}
675+
result := FormatEventAsText(event)
676+
assert.Contains(t, result, "FINAL CONCLUSION")
677+
assert.Contains(t, result, "Synthesized conclusion")
678+
assert.Contains(t, result, "═")
679+
})
680+
}
681+
682+
// TestDialogueEventTypeNewPhaseEvents tests all new phase event types are defined
683+
func TestDialogueEventTypeNewPhaseEvents(t *testing.T) {
684+
t.Run("All phase event types are defined", func(t *testing.T) {
685+
assert.Equal(t, DialogueEventType("phase_start"), EventPhaseStart)
686+
assert.Equal(t, DialogueEventType("phase_progress"), EventPhaseProgress)
687+
assert.Equal(t, DialogueEventType("phase_end"), EventPhaseEnd)
688+
assert.Equal(t, DialogueEventType("validation_result"), EventValidationResult)
689+
assert.Equal(t, DialogueEventType("polish_result"), EventPolishResult)
690+
assert.Equal(t, DialogueEventType("final_synthesis"), EventFinalSynthesis)
691+
})
692+
693+
t.Run("Phase event types are unique", func(t *testing.T) {
694+
types := []DialogueEventType{
695+
EventPhaseStart, EventPhaseProgress, EventPhaseEnd,
696+
EventValidationResult, EventPolishResult, EventFinalSynthesis,
697+
}
698+
uniqueTypes := make(map[DialogueEventType]bool)
699+
for _, et := range types {
700+
assert.False(t, uniqueTypes[et], "Event type %s should be unique", et)
701+
uniqueTypes[et] = true
702+
}
703+
})
704+
}
705+
706+
// TestPhaseEventData tests the phase event data structure
707+
func TestPhaseEventData(t *testing.T) {
708+
t.Run("Creates valid phase event data", func(t *testing.T) {
709+
data := PhaseEventData{
710+
Phase: "validation",
711+
PhaseOrder: 2,
712+
PhaseIcon: "✓",
713+
ValidationScore: 0.85,
714+
PolishScore: 0.0,
715+
Confidence: 0.8,
716+
}
717+
assert.Equal(t, "validation", data.Phase)
718+
assert.Equal(t, 2, data.PhaseOrder)
719+
assert.Equal(t, "✓", data.PhaseIcon)
720+
assert.InDelta(t, 0.85, data.ValidationScore, 0.01)
721+
assert.Equal(t, 0.0, data.PolishScore)
722+
assert.InDelta(t, 0.8, data.Confidence, 0.01)
723+
})
634724
}
635725

636726
// TestDebateRound tests debate round struct

0 commit comments

Comments
 (0)