diff --git a/contracts/epistemics/types.go b/contracts/epistemics/types.go index 34abbcd..812c338 100644 --- a/contracts/epistemics/types.go +++ b/contracts/epistemics/types.go @@ -122,6 +122,15 @@ type ExperienceRecord struct { VerificationEvidence []EvidenceRef ConfidenceMillis int64 RecordedAtUnixMillis int64 + ProblemStatement string + AttemptRef string + WhyAttempted string + ApplicabilityConditions []string + ContextScopeRef string + EpisodeRef string + GoalRef string + TaskRef string + WhySucceededOrFailed string } // ReflectionCandidate records that broader reflection may be warranted. @@ -163,3 +172,13 @@ type BeliefAssessment struct { EvidenceRefs []EvidenceRef AssessedAtUnixMillis int64 } + +type EpisodeID ids.ID +type Episode struct { + ID EpisodeID + PrincipalID string + ExperienceRefs []ExperienceRecordID + Summary string + Outcome OutcomeClass + RecordedAtUnixMillis int64 +} diff --git a/dev/ACTIVE_TASK.json b/dev/ACTIVE_TASK.json index 95631c0..cf4fdb8 100644 --- a/dev/ACTIVE_TASK.json +++ b/dev/ACTIVE_TASK.json @@ -1 +1 @@ -{"task_file":"dev/tasks/GEN2-007-general-freshness-volatility-temporal-applicability-and-revalidation.json","task_id":"GEN2-007","task_revision":1} \ No newline at end of file +{"task_file":"dev/tasks/GEN2-008-promote-episode-and-experience-v2-including-negative-experience.json","task_id":"GEN2-008","task_revision":1} \ No newline at end of file diff --git a/modules/epistemics/domain/episode.go b/modules/epistemics/domain/episode.go new file mode 100644 index 0000000..9a3af18 --- /dev/null +++ b/modules/epistemics/domain/episode.go @@ -0,0 +1,29 @@ +package domain + +import ( + "git.cin.su/m/Assistant/contracts/epistemics" + "git.cin.su/m/Assistant/platform/ids" + "strings" +) + +func BuildEpisode(experiences []epistemics.ExperienceRecord, summary string, at int64) (epistemics.Episode, error) { + if len(experiences) == 0 || strings.TrimSpace(summary) == "" || at < 1 { + return epistemics.Episode{}, ErrInvalidExperience + } + refs := make([]epistemics.ExperienceRecordID, 0, len(experiences)) + outcome := epistemics.OutcomeUnknown + for _, e := range experiences { + if _, err := NewExperienceRecord(e); err != nil { + return epistemics.Episode{}, err + } + refs = append(refs, e.ID) + if e.ActualOutcome != epistemics.OutcomeSuccess { + outcome = e.ActualOutcome + } + } + id, err := ids.New() + if err != nil { + return epistemics.Episode{}, err + } + return epistemics.Episode{ID: epistemics.EpisodeID(id), ExperienceRefs: refs, Summary: summary, Outcome: outcome, RecordedAtUnixMillis: at}, nil +} diff --git a/modules/epistemics/domain/episode_test.go b/modules/epistemics/domain/episode_test.go new file mode 100644 index 0000000..eed130a --- /dev/null +++ b/modules/epistemics/domain/episode_test.go @@ -0,0 +1,15 @@ +package domain_test + +import ( + "git.cin.su/m/Assistant/contracts/epistemics" + "git.cin.su/m/Assistant/modules/epistemics/domain" + "testing" +) + +func TestEpisodeIsRebuildableFromExperience(t *testing.T) { + e := epistemics.ExperienceRecord{ID: "e", SourceKind: epistemics.ExperienceSourceInteraction, OriginalIntentID: "i", SourceUtteranceID: "u", HelpMethod: epistemics.HelpMethodFallback, ExpectedOutcome: epistemics.OutcomeSuccess, ActualOutcome: epistemics.OutcomeFailed, RecordedAtUnixMillis: 1} + ep, err := domain.BuildEpisode([]epistemics.ExperienceRecord{e}, "failed attempt", 1) + if err != nil || len(ep.ExperienceRefs) != 1 || ep.Outcome != epistemics.OutcomeFailed { + t.Fatalf("episode=%#v err=%v", ep, err) + } +}