From e0a80ec621c1c254673fdeb68877d31e2ef8846b Mon Sep 17 00:00:00 2001 From: lxowalle Date: Mon, 11 May 2026 15:24:21 +0800 Subject: [PATCH] fix evolution review issues --- pkg/agent/evolution_bridge.go | 2 +- pkg/agent/evolution_bridge_test.go | 19 +++++++++++-------- pkg/config/config_test.go | 2 +- pkg/config/defaults.go | 2 +- pkg/evolution/apply.go | 23 ++++++++++------------- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/pkg/agent/evolution_bridge.go b/pkg/agent/evolution_bridge.go index f2d471bfb..2e54c8690 100644 --- a/pkg/agent/evolution_bridge.go +++ b/pkg/agent/evolution_bridge.go @@ -213,7 +213,7 @@ func (b *evolutionBridge) handleTurnEndAsync(meta EventMeta, payload TurnEndPayl b.closeMu.Unlock() go func() { defer b.wg.Done() - if err := b.runtime.FinalizeTurn(context.Background(), input); err != nil { + if err := b.runtime.FinalizeTurn(b.bgCtx, input); err != nil { logger.WarnCF("agent", "Evolution finalize turn failed", map[string]any{ "error": err.Error(), "turn_id": input.TurnID, diff --git a/pkg/agent/evolution_bridge_test.go b/pkg/agent/evolution_bridge_test.go index dbfd65bfb..8469acd80 100644 --- a/pkg/agent/evolution_bridge_test.go +++ b/pkg/agent/evolution_bridge_test.go @@ -298,7 +298,7 @@ func TestEvolutionBridge_DirectDeliveryFailureFallsBackToCurrentRuntimeBridge(t } } -func TestEvolutionBridge_CloseFlushesPendingTurnEndRecord(t *testing.T) { +func TestEvolutionBridge_CloseCancelsPendingTurnEndRecord(t *testing.T) { tmpDir := t.TempDir() al := newEvolutionTestLoop(t, tmpDir, config.EvolutionConfig{ Enabled: true, @@ -315,14 +315,17 @@ func TestEvolutionBridge_CloseFlushesPendingTurnEndRecord(t *testing.T) { UserMessage: "close flush task", FinalContent: "ok", }) - al.Close() - record := waitForEvolutionRecord(t, filepath.Join(tmpDir, "state", "evolution", "task-records.jsonl")) - if got := record["session_key"]; got != "session-close-flush" { - t.Fatalf("session_key = %v, want session-close-flush", got) - } - if got := record["summary"]; got != "close flush task" { - t.Fatalf("summary = %v, want close flush task", got) + done := make(chan struct{}) + go func() { + al.Close() + close(done) + }() + + select { + case <-done: + case <-time.After(2 * time.Second): + t.Fatal("Close timed out") } } diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 71e5666b3..fe5102dbd 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -175,7 +175,7 @@ func TestDefaultConfig_EvolutionDefaults(t *testing.T) { cfg := DefaultConfig() assert.False(t, cfg.Evolution.Enabled) - assert.Equal(t, "apply", cfg.Evolution.Mode) + assert.Equal(t, "observe", cfg.Evolution.Mode) assert.Equal(t, "", cfg.Evolution.StateDir) assert.Equal(t, 2, cfg.Evolution.MinTaskCount) assert.Equal(t, 0.7, cfg.Evolution.MinSuccessRatio) diff --git a/pkg/config/defaults.go b/pkg/config/defaults.go index 9103a8d5d..1742a4b87 100644 --- a/pkg/config/defaults.go +++ b/pkg/config/defaults.go @@ -49,7 +49,7 @@ func DefaultConfig() *Config { }, Evolution: EvolutionConfig{ Enabled: false, - Mode: "apply", + Mode: "observe", MinTaskCount: 2, MinSuccessRatio: 0.7, ColdPathTrigger: "after_turn", diff --git a/pkg/evolution/apply.go b/pkg/evolution/apply.go index 6a0db20d5..7cb1b9b5e 100644 --- a/pkg/evolution/apply.go +++ b/pkg/evolution/apply.go @@ -57,29 +57,26 @@ func (a *Applier) applyDraftWithRollback( return nil, err } - skillDir := filepath.Join(workspace, "skills", draft.TargetSkillName) - if mkdirErr := os.MkdirAll(skillDir, 0o755); mkdirErr != nil { - return nil, mkdirErr - } - renderedBody, err := renderAppliedBody(draft, existingBody, hadOriginal) if err != nil { return nil, err } - skillPath := filepath.Join(skillDir, "SKILL.md") - if err := fileutil.WriteFileAtomic(skillPath, []byte(renderedBody), 0o644); err != nil { - return nil, err - } - if err := validateAppliedSkillBody( renderedBody, draft.TargetSkillName, allowsExistingFrontmatterFields(draft.ChangeKind, hadOriginal), ); err != nil { - if rollbackErr := a.rollbackSkill(skillPath, backupPath, hadOriginal); rollbackErr != nil { - return nil, errorsJoin(err, rollbackErr) - } + return nil, err + } + + skillDir := filepath.Join(workspace, "skills", draft.TargetSkillName) + if mkdirErr := os.MkdirAll(skillDir, 0o755); mkdirErr != nil { + return nil, mkdirErr + } + + skillPath := filepath.Join(skillDir, "SKILL.md") + if err := fileutil.WriteFileAtomic(skillPath, []byte(renderedBody), 0o644); err != nil { return nil, err }