From 36272b903616a7358059e54d4cb5e815fd8be174 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sat, 29 Aug 2026 11:28:52 +0300 Subject: [PATCH] GEN2-019: add advisory consequence assessment --- contracts/work/consequence.go | 24 ++++++++++++++++++++++++ dev/ACTIVE_TASK.json | 2 +- modules/work/domain/consequence.go | 14 ++++++++++++++ modules/work/domain/consequence_test.go | 13 +++++++++++++ 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 contracts/work/consequence.go create mode 100644 modules/work/domain/consequence.go create mode 100644 modules/work/domain/consequence_test.go diff --git a/contracts/work/consequence.go b/contracts/work/consequence.go new file mode 100644 index 0000000..5cc8f06 --- /dev/null +++ b/contracts/work/consequence.go @@ -0,0 +1,24 @@ +package work + +type ConsequenceAssessment struct { + ID string + TargetRefs []string + Impact int64 + Reversibility int64 + Uncertainty int64 + Scope int64 + Recoverability int64 + CostOfError int64 + ExpectedConsequences []string + MitigationOptions []string + RequiresDryRun bool + RequiresBackup bool + RecommendedConfirmation string + OwnerAccepted bool + EvidenceRefs []EvidenceRef + RecordedAtUnixMillis int64 +} + +func (a ConsequenceAssessment) Valid() bool { + return a.ID != "" && len(a.TargetRefs) > 0 && a.Impact >= 0 && a.Impact <= 1000 && a.Reversibility >= 0 && a.Reversibility <= 1000 && a.Uncertainty >= 0 && a.Uncertainty <= 1000 && a.Recoverability >= 0 && a.Recoverability <= 1000 && a.RecordedAtUnixMillis > 0 +} diff --git a/dev/ACTIVE_TASK.json b/dev/ACTIVE_TASK.json index 3935773..8d3717b 100644 --- a/dev/ACTIVE_TASK.json +++ b/dev/ACTIVE_TASK.json @@ -1 +1 @@ -{"task_file":"dev/tasks/GEN2-018-add-perspective-and-dynamic-specialist-team-semantics-on-existing-work-g.json","task_id":"GEN2-018","task_revision":1} \ No newline at end of file +{"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 diff --git a/modules/work/domain/consequence.go b/modules/work/domain/consequence.go new file mode 100644 index 0000000..8e94c08 --- /dev/null +++ b/modules/work/domain/consequence.go @@ -0,0 +1,14 @@ +package domain + +import "git.cin.su/m/Assistant/contracts/work" + +func AssessConsequences(id string, target string, impact, reversibility, uncertainty, recoverability, cost int64, at int64) work.ConsequenceAssessment { + a := work.ConsequenceAssessment{ID: id, TargetRefs: []string{target}, Impact: impact, Reversibility: reversibility, Uncertainty: uncertainty, Recoverability: recoverability, CostOfError: cost, RecordedAtUnixMillis: at} + a.RequiresDryRun = impact >= 700 || reversibility >= 700 + a.RequiresBackup = reversibility >= 500 + a.RecommendedConfirmation = "STANDARD" + if uncertainty*cost > 500000 { + a.RecommendedConfirmation = "EXPLICIT_OWNER_CONFIRMATION" + } + return a +} diff --git a/modules/work/domain/consequence_test.go b/modules/work/domain/consequence_test.go new file mode 100644 index 0000000..fe6583f --- /dev/null +++ b/modules/work/domain/consequence_test.go @@ -0,0 +1,13 @@ +package domain_test + +import ( + "git.cin.su/m/Assistant/modules/work/domain" + "testing" +) + +func TestConsequenceAdvisesMitigationWithoutCapabilityBlacklist(t *testing.T) { + a := domain.AssessConsequences("a", "database:a", 800, 800, 900, 300, 900, 1) + if !a.Valid() || !a.RequiresDryRun || !a.RequiresBackup || a.RecommendedConfirmation != "EXPLICIT_OWNER_CONFIRMATION" { + t.Fatalf("%#v", a) + } +}