diff --git a/contracts/epistemics/truth.go b/contracts/epistemics/truth.go index b791643..2702a9d 100644 --- a/contracts/epistemics/truth.go +++ b/contracts/epistemics/truth.go @@ -1,5 +1,7 @@ package epistemics +import "git.cin.su/m/Assistant/platform/ids" + type BeliefState string const ( @@ -9,19 +11,27 @@ const ( ) type Observation struct { - ID ObservationID - SourceSnapshot SourceSnapshotID - Excerpt SourceExcerptID - Text string - ObservedAt int64 + ID ObservationID + SourceSnapshot SourceSnapshotID + Excerpt SourceExcerptID + Text string + ObservedAt int64 + PrincipalID string + ContextScopeRef string + ObservationKind string + Payload string + ExtractorRef string } type Claim struct { - ID ClaimID - Statement string - ObservationID ObservationID - CitationID CitationID - Verification VerificationState + ID ClaimID + Statement string + ObservationID ObservationID + CitationID CitationID + Verification VerificationState + PropositionID ids.ID + RevisedFrom *ClaimID + RecordedAtUnixMillis int64 } type Belief struct { diff --git a/contracts/epistemics/types.go b/contracts/epistemics/types.go index 2927aed..34abbcd 100644 --- a/contracts/epistemics/types.go +++ b/contracts/epistemics/types.go @@ -24,6 +24,8 @@ type HelpMethodKind string type OutcomeClass string type ReflectionTriggerKind string type ReflectionCandidateState string +type PropositionKind string +type BeliefAssessmentState string const ( VerificationUnverified VerificationState = "UNVERIFIED" @@ -73,6 +75,12 @@ const ( ReflectionCandidateEvaluating ReflectionCandidateState = "EVALUATING" ReflectionCandidateSuperseded ReflectionCandidateState = "SUPERSEDED" ReflectionCandidateResolved ReflectionCandidateState = "RESOLVED" + PropositionWorldFacet PropositionKind = "WORLD_FACET" + PropositionWorldRelation PropositionKind = "WORLD_RELATION" + PropositionOwnerDefined PropositionKind = "OWNER_DEFINED" + PropositionTextual PropositionKind = "TEXTUAL" + BeliefAssessmentCurrent BeliefAssessmentState = "CURRENT" + BeliefAssessmentSuperseded BeliefAssessmentState = "SUPERSEDED" ) // SystemExpectation records what Domovoy expected a meaningful help path to @@ -134,3 +142,24 @@ type ReflectionCandidate struct { ClaimedBy string ClaimExpiresAtUnixMillis int64 } + +type Proposition struct { + ID ids.ID + Kind PropositionKind + SubjectRef string + PredicateRef string + ObjectValue string + ObjectRef string + Qualifiers []string + TextFallback string +} + +type BeliefAssessment struct { + ID ids.ID + ClaimID ClaimID + Revision ids.Revision + State BeliefAssessmentState + ConfidenceMillis int64 + EvidenceRefs []EvidenceRef + AssessedAtUnixMillis int64 +} diff --git a/dev/ACTIVE_TASK.json b/dev/ACTIVE_TASK.json index 7f35a38..1aeb56a 100644 --- a/dev/ACTIVE_TASK.json +++ b/dev/ACTIVE_TASK.json @@ -1 +1 @@ -{"task_file":"dev/tasks/GEN2-005-world-identity-resolution-and-version-environment-bindings.json","task_id":"GEN2-005","task_revision":1} +{"task_file":"dev/tasks/GEN2-006-normalize-epistemics-evidence-propositions-claims-and-belief-assessments.json","task_id":"GEN2-006","task_revision":1} \ No newline at end of file diff --git a/modules/epistemics/domain/knowledge_v2.go b/modules/epistemics/domain/knowledge_v2.go new file mode 100644 index 0000000..4b2966a --- /dev/null +++ b/modules/epistemics/domain/knowledge_v2.go @@ -0,0 +1,36 @@ +package domain + +import ( + "errors" + "git.cin.su/m/Assistant/contracts/epistemics" + "git.cin.su/m/Assistant/platform/ids" + "strings" +) + +var ErrInvalidKnowledge = errors.New("invalid epistemic knowledge record") + +func ValidateProposition(value epistemics.Proposition) error { + if value.ID == "" || value.Kind == "" || strings.TrimSpace(value.SubjectRef) == "" || (value.ObjectValue == "" && value.ObjectRef == "" && value.TextFallback == "") { + return ErrInvalidKnowledge + } + return nil +} + +func ValidateBeliefAssessment(value epistemics.BeliefAssessment) error { + if value.ID == "" || value.ClaimID == "" || !value.Revision.Valid() || value.State == "" || value.ConfidenceMillis < 0 || value.ConfidenceMillis > 1000 || value.AssessedAtUnixMillis < 1 { + return ErrInvalidKnowledge + } + return nil +} + +func NewBeliefAssessment(claim epistemics.ClaimID, confidence int64, state epistemics.BeliefAssessmentState, evidence []epistemics.EvidenceRef, at int64) (epistemics.BeliefAssessment, error) { + id, err := ids.New() + if err != nil { + return epistemics.BeliefAssessment{}, err + } + value := epistemics.BeliefAssessment{ID: id, ClaimID: claim, Revision: ids.InitialRevision, State: state, ConfidenceMillis: confidence, EvidenceRefs: append([]epistemics.EvidenceRef(nil), evidence...), AssessedAtUnixMillis: at} + if err := ValidateBeliefAssessment(value); err != nil { + return epistemics.BeliefAssessment{}, err + } + return value, nil +} diff --git a/modules/epistemics/domain/knowledge_v2_test.go b/modules/epistemics/domain/knowledge_v2_test.go new file mode 100644 index 0000000..e297e81 --- /dev/null +++ b/modules/epistemics/domain/knowledge_v2_test.go @@ -0,0 +1,22 @@ +package domain_test + +import ( + "git.cin.su/m/Assistant/contracts/epistemics" + "git.cin.su/m/Assistant/modules/epistemics/domain" + "testing" +) + +func TestKnowledgeV2SeparatesPropositionAndReassessableBelief(t *testing.T) { + p := epistemics.Proposition{ID: "p", Kind: epistemics.PropositionWorldFacet, SubjectRef: "world:database:a", ObjectValue: "1.6.28"} + if err := domain.ValidateProposition(p); err != nil { + t.Fatal(err) + } + a, err := domain.NewBeliefAssessment("claim:a", 800, epistemics.BeliefAssessmentCurrent, []epistemics.EvidenceRef{"observation:a"}, 1) + if err != nil { + t.Fatal(err) + } + a.Revision++ + if err := domain.ValidateBeliefAssessment(a); err != nil { + t.Fatal(err) + } +}