package models import ( "crypto/sha256" "encoding/hex" "git.cin.su/m/Assistant/contracts/capability" commitcontract "git.cin.su/m/Assistant/contracts/commit" "git.cin.su/m/Assistant/contracts/identity" "git.cin.su/m/Assistant/contracts/work" "git.cin.su/m/Assistant/platform/ids" ) // DeterministicRequest is already target-bound. The adapter performs no text // routing and emits a candidate only; Commit remains the execution boundary. type DeterministicRequest struct { ActorID identity.ActorID CapabilityID capability.CapabilityID Target work.TaskTarget Operation commitcontract.ExternalOperation } type Candidate struct { Proposal commitcontract.ActionProposal Seed string } func Propose(request DeterministicRequest) Candidate { seed := string(request.ActorID) + "|" + string(request.CapabilityID) + "|" + string(request.Target.TaskID) + "|" + string(request.Target.GoalID) + "|" + string(request.Target.ScopeID) + "|" + string(request.Operation) digest := sha256.Sum256([]byte(seed)) intent := commitcontract.ActionIntentID(ids.ID(hex.EncodeToString(digest[:16]))) return Candidate{Seed: hex.EncodeToString(digest[:]), Proposal: commitcontract.ActionProposal{IntentID: intent, ActorID: request.ActorID, CapabilityID: request.CapabilityID, Target: request.Target, Operation: request.Operation, State: commitcontract.ActionProposed}} }