diff --git a/contracts/self/types.go b/contracts/self/types.go new file mode 100644 index 0000000..b381b00 --- /dev/null +++ b/contracts/self/types.go @@ -0,0 +1,92 @@ +package self + +import "fmt" + +type AssessmentID string +type LearningLedgerEntryID string +type AssessmentState string + +const ( + AssessmentCandidate AssessmentState = "CANDIDATE" + AssessmentConfirmed AssessmentState = "CONFIRMED" + AssessmentMonitoring AssessmentState = "MONITORING" + AssessmentResolved AssessmentState = "RESOLVED" +) + +type CompetenceAssessment struct { + ID AssessmentID + PrincipalID string + SubjectRef SemanticReference + Revision uint64 + ContextMatcher []string + QualityMillis int64 + ReliabilityMillis int64 + ConfidenceMillis int64 + EvidenceRefs []SemanticReference + LastValidatedAt int64 + AssessedAt int64 + SupersedesRef *SemanticReference +} +type WeaknessPattern struct { + ID AssessmentID + PrincipalID string + Revision uint64 + PatternKey string + ContextMatcher []string + FailureMode string + DetectionEvidenceRefs []SemanticReference + State AssessmentState + RecordedAt int64 +} +type DependencyAssessment struct { + ID AssessmentID + SubjectRef SemanticReference + DependencyRef SemanticReference + ImpactClass string + CurrentEffect string + EvidenceRefs []SemanticReference + AssessedAt int64 +} +type ImprovementNeed struct { + ID AssessmentID + PrincipalID string + SubjectRef SemanticReference + ProblemSummary string + EvidenceRefs []SemanticReference + ExpectedBenefit string + Priority int + State string + CreatedAt int64 +} +type LearningLedgerEntry struct { + ID LearningLedgerEntryID + PrincipalID string + ImprovementNeedRef *SemanticReference + ObservedProblem string + EvidenceRefs []SemanticReference + Diagnosis string + Hypothesis string + ProposedChangeRef SemanticReference + ExpectedImprovement string + ActualEvaluationRefs []SemanticReference + DevelopmentGateRef *SemanticReference + BeforeVersionRefs []SemanticReference + AfterVersionRefs []SemanticReference + Decision string + SideEffects []string + RollbackRef *SemanticReference + RecordedAt int64 +} + +func (a CompetenceAssessment) Validate() error { + if a.ID == "" || a.PrincipalID == "" || !a.SubjectRef.Valid() || a.Revision < 1 || a.ConfidenceMillis < 0 || a.ConfidenceMillis > 1000 || len(a.EvidenceRefs) == 0 || a.AssessedAt < 1 { + return fmt.Errorf("competence requires evidence") + } + return nil +} +func (l LearningLedgerEntry) Validate() error { + if l.ID == "" || l.PrincipalID == "" || l.ObservedProblem == "" || len(l.EvidenceRefs) == 0 || l.Decision == "" || l.RecordedAt < 1 { + return fmt.Errorf("learning ledger entry is incomplete") + } + return nil +} diff --git a/database/migrations/049_self_foundation.sql b/database/migrations/049_self_foundation.sql new file mode 100644 index 0000000..cae68fd --- /dev/null +++ b/database/migrations/049_self_foundation.sql @@ -0,0 +1,7 @@ +BEGIN; +SET ROLE self_role; +CREATE TABLE IF NOT EXISTS self.competence_assessments (assessment_id TEXT PRIMARY KEY, principal_id TEXT NOT NULL, subject_ref JSONB NOT NULL, revision BIGINT NOT NULL CHECK(revision>0), context_matcher JSONB NOT NULL, confidence_millis BIGINT NOT NULL, evidence_refs JSONB NOT NULL, assessed_at_unix_millis BIGINT NOT NULL); +CREATE TABLE IF NOT EXISTS self.learning_ledger (entry_id TEXT PRIMARY KEY, principal_id TEXT NOT NULL, observed_problem TEXT NOT NULL, evidence_refs JSONB NOT NULL, diagnosis TEXT NOT NULL, hypothesis TEXT NOT NULL, decision TEXT NOT NULL, recorded_at_unix_millis BIGINT NOT NULL); +GRANT SELECT, INSERT, UPDATE ON self.competence_assessments, self.learning_ledger TO self_role; +RESET ROLE; +COMMIT; diff --git a/dev/ACTIVE_TASK.json b/dev/ACTIVE_TASK.json index d33a2bc..8256381 100644 --- a/dev/ACTIVE_TASK.json +++ b/dev/ACTIVE_TASK.json @@ -1 +1 @@ -{"task_file":"dev/tasks/GEN2-014-add-explicit-reflex-lifecycle-shadow-reasoning-and-revalidation.json","task_id":"GEN2-014","task_revision":1} \ No newline at end of file +{"task_file":"dev/tasks/GEN2-015-add-evidence-backed-self-foundation-and-learning-ledger.json","task_id":"GEN2-015","task_revision":1} \ No newline at end of file diff --git a/modules/self/domain/self.go b/modules/self/domain/self.go new file mode 100644 index 0000000..cdb5f4c --- /dev/null +++ b/modules/self/domain/self.go @@ -0,0 +1,4 @@ +package domain +import("git.cin.su/m/Assistant/contracts/self") +func ValidateCompetence(v self.CompetenceAssessment) error{return v.Validate()} +func ValidateLearning(v self.LearningLedgerEntry) error{return v.Validate()} diff --git a/modules/self/domain/self_test.go b/modules/self/domain/self_test.go new file mode 100644 index 0000000..a377135 --- /dev/null +++ b/modules/self/domain/self_test.go @@ -0,0 +1,3 @@ +package domain_test +import("testing"; selfcontract "git.cin.su/m/Assistant/contracts/self"; "git.cin.su/m/Assistant/modules/self/domain") +func TestCompetenceCannotBeSelfDeclaredWithoutEvidence(t *testing.T){v:=selfcontract.CompetenceAssessment{ID:"a",PrincipalID:"p",SubjectRef:selfcontract.SemanticReference{OwnerNamespace:"capability",SemanticKind:"skill",StableID:"s"},Revision:1,ConfidenceMillis:1000,AssessedAt:1};if domain.ValidateCompetence(v)==nil{t.Fatal("unsupported competence accepted")};v.EvidenceRefs=[]selfcontract.SemanticReference{{OwnerNamespace:"epistemics",SemanticKind:"evaluation",StableID:"e"}};if err:=domain.ValidateCompetence(v);err!=nil{t.Fatal(err)}}