package hostclaim // QueueRelocationRelease records a stop-only obligation before requesting root // evidence. The caller supplies a stable retirement identity for this release. func QueueRelocationRelease(opID, box, region, retirement string) func(*Claim) error { return func(c *Claim) error { if c == nil || c.Holder == nil || c.Op.ID != opID || opID == "" || c.Op.Kind != KindRelocating || c.Op.Phase != "releasing" || c.Op.Exec != box || c.Op.Intent["source_box"] != box || c.Op.Intent["region"] != region || !validBoxReference(box) || box == "none" || region == "" || retirement == "" { return ErrWrongState } for _, o := range c.Obligations { if o.ID == "relocation-release" { if o.Kind == "relocation-release" && o.Op == opID && o.Box == box && o.Region == region && o.Owner == "region:"+region && o.Park == nil && o.Retirement == retirement { return nil } return ErrWrongState } } if c.Op.Journal["release_stop_receipt"] != "" { return ErrWrongState } c.Obligations = append(c.Obligations, Obligation{ID: "relocation-release", Kind: "relocation-release", Op: opID, Box: box, Region: region, Owner: "region:" + region, Retirement: retirement}) return nil } }