From 4de506a2afef85e100727253c045580c4ecbd2e1 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sat, 29 Aug 2026 11:30:05 +0300 Subject: [PATCH] GEN2-020: separate execution receipts from world outcomes --- contracts/commit/execution_receipt.go | 32 +++++++++++++++++++++++++ contracts/epistemics/outcome.go | 30 +++++++++++++++++++++++ dev/ACTIVE_TASK.json | 2 +- tests/execution_outcome/outcome_test.go | 18 ++++++++++++++ 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 contracts/commit/execution_receipt.go create mode 100644 contracts/epistemics/outcome.go create mode 100644 tests/execution_outcome/outcome_test.go diff --git a/contracts/commit/execution_receipt.go b/contracts/commit/execution_receipt.go new file mode 100644 index 0000000..40cdeeb --- /dev/null +++ b/contracts/commit/execution_receipt.go @@ -0,0 +1,32 @@ +package commit + +type ExecutorResult string +type AmbiguityState string + +const ( + ExecutorAccepted ExecutorResult = "ACCEPTED" + ExecutorReportedSuccess ExecutorResult = "REPORTED_SUCCESS" + ExecutorReportedFailure ExecutorResult = "REPORTED_FAILURE" + ExecutorNoResponse ExecutorResult = "NO_RESPONSE" + ExecutorAmbiguous ExecutorResult = "AMBIGUOUS" +) + +type ExecutionReceipt struct { + ID string + ActionAttemptRef ActionAttemptID + ExecutorImplementationRef string + ExternalOperationRef string + ExternalRequestID string + RequestDigest string + ResponseDigest string + DispatchAtUnixMillis int64 + CompletedAtUnixMillis *int64 + ExecutorResult ExecutorResult + Ambiguity AmbiguityState + ReconciliationKey string + RawArtifactRef string +} + +func (r ExecutionReceipt) Valid() bool { + return r.ID != "" && r.ActionAttemptRef != "" && r.ExecutorImplementationRef != "" && r.RequestDigest != "" && r.ExecutorResult != "" && r.ReconciliationKey != "" && r.DispatchAtUnixMillis > 0 +} diff --git a/contracts/epistemics/outcome.go b/contracts/epistemics/outcome.go new file mode 100644 index 0000000..707e556 --- /dev/null +++ b/contracts/epistemics/outcome.go @@ -0,0 +1,30 @@ +package epistemics + +type WorldOutcomeState string + +const ( + OutcomeVerifiedSuccess WorldOutcomeState = "VERIFIED_SUCCESS" + OutcomeVerifiedPartial WorldOutcomeState = "VERIFIED_PARTIAL" + OutcomeVerifiedFailure WorldOutcomeState = "VERIFIED_FAILURE" + OutcomeUnverified WorldOutcomeState = "UNVERIFIED" + OutcomeUnknownState WorldOutcomeState = "UNKNOWN" + OutcomeConflicted WorldOutcomeState = "CONFLICTED" +) + +type WorldOutcomeAssessment struct { + ID string + PrincipalID string + ActionAttemptRef string + ExecutionReceiptRefs []string + ExpectedEffectRef string + ObservationRefs []ObservationID + ClaimRefs []ClaimID + State WorldOutcomeState + ConfidenceMillis int64 + EvidenceRefs []EvidenceRef + AssessedAt int64 +} + +func (a WorldOutcomeAssessment) Valid() bool { + return a.ID != "" && a.PrincipalID != "" && a.ActionAttemptRef != "" && a.State != "" && a.ConfidenceMillis >= 0 && a.ConfidenceMillis <= 1000 && a.AssessedAt > 0 +} diff --git a/dev/ACTIVE_TASK.json b/dev/ACTIVE_TASK.json index 8d3717b..10cd1ed 100644 --- a/dev/ACTIVE_TASK.json +++ b/dev/ACTIVE_TASK.json @@ -1 +1 @@ -{"task_file":"dev/tasks/GEN2-019-add-consequence-risk-assessment-without-artificial-capability-blacklist.json","task_id":"GEN2-019","task_revision":1} \ No newline at end of file +{"task_file":"dev/tasks/GEN2-020-separate-execution-receipt-from-verified-world-outcome.json","task_id":"GEN2-020","task_revision":1} \ No newline at end of file diff --git a/tests/execution_outcome/outcome_test.go b/tests/execution_outcome/outcome_test.go new file mode 100644 index 0000000..bffcc07 --- /dev/null +++ b/tests/execution_outcome/outcome_test.go @@ -0,0 +1,18 @@ +package execution_outcome_test + +import ( + "git.cin.su/m/Assistant/contracts/commit" + "git.cin.su/m/Assistant/contracts/epistemics" + "testing" +) + +func TestReportedExecutionSuccessIsNotWorldVerification(t *testing.T) { + r := commit.ExecutionReceipt{ID: "r", ActionAttemptRef: "a", ExecutorImplementationRef: "impl", RequestDigest: "d", ExecutorResult: commit.ExecutorReportedSuccess, ReconciliationKey: "k", DispatchAtUnixMillis: 1} + if !r.Valid() { + t.Fatal("receipt invalid") + } + o := epistemics.WorldOutcomeAssessment{ID: "o", PrincipalID: "p", ActionAttemptRef: "a", State: epistemics.OutcomeUnverified, ConfidenceMillis: 0, AssessedAt: 1} + if !o.Valid() { + t.Fatal("unverified assessment invalid") + } +}