73 lines
2 KiB
Go
73 lines
2 KiB
Go
package evolution
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func SaveAppliedProfile(store *Store, workspace string, draft SkillDraft, now time.Time) error {
|
|
profile, err := store.LoadProfile(draft.TargetSkillName)
|
|
if err != nil && !errors.Is(err, os.ErrNotExist) {
|
|
return err
|
|
}
|
|
if errors.Is(err, os.ErrNotExist) {
|
|
profile = SkillProfile{
|
|
SkillName: draft.TargetSkillName,
|
|
WorkspaceID: workspace,
|
|
Origin: "evolved",
|
|
}
|
|
}
|
|
|
|
profile.SkillName = draft.TargetSkillName
|
|
profile.WorkspaceID = workspace
|
|
profile.CurrentVersion = draft.ID
|
|
profile.Status = SkillStatusActive
|
|
profile.Origin = profileOrigin(profile.Origin)
|
|
profile.HumanSummary = draft.HumanSummary
|
|
profile.ChangeReason = draft.HumanSummary
|
|
profile.IntendedUseCases = append([]string(nil), draft.IntendedUseCases...)
|
|
profile.PreferredEntryPath = append([]string(nil), draft.PreferredEntryPath...)
|
|
profile.AvoidPatterns = append([]string(nil), draft.AvoidPatterns...)
|
|
profile.LastUsedAt = now
|
|
if profile.RetentionScore <= 0 {
|
|
profile.RetentionScore = 1
|
|
}
|
|
profile.VersionHistory = append(profile.VersionHistory, SkillVersionEntry{
|
|
Version: draft.ID,
|
|
Action: string(draft.ChangeKind),
|
|
Timestamp: now,
|
|
DraftID: draft.ID,
|
|
Summary: draft.HumanSummary,
|
|
})
|
|
return store.SaveProfile(profile)
|
|
}
|
|
|
|
func inferIntendedUseCases(rule LearningRecord) []string {
|
|
summary := strings.TrimSpace(rule.Summary)
|
|
if summary == "" {
|
|
return nil
|
|
}
|
|
return []string{summary}
|
|
}
|
|
|
|
func inferPreferredEntryPath(rule LearningRecord) []string {
|
|
if len(rule.WinningPath) == 0 {
|
|
return nil
|
|
}
|
|
return append([]string(nil), rule.WinningPath...)
|
|
}
|
|
|
|
func inferAvoidPatterns(rule LearningRecord) []string {
|
|
if len(rule.LateAddedSkills) == 0 || len(rule.WinningPath) <= len(rule.LateAddedSkills) {
|
|
return nil
|
|
}
|
|
prefix := rule.WinningPath[:len(rule.WinningPath)-len(rule.LateAddedSkills)]
|
|
if len(prefix) == 0 {
|
|
return nil
|
|
}
|
|
return []string{
|
|
"avoid starting with " + strings.Join(prefix, " -> ") + " before using " + strings.Join(rule.LateAddedSkills, " -> "),
|
|
}
|
|
}
|