package hostactors import ( "context" "github.com/carlosframework/platform/internal/hostclaim" "github.com/carlosframework/platform/internal/hostfloor" "github.com/carlosframework/platform/internal/release" "slices" "strings" "time" ) func (d Directory) ReleaseActivation(ctx context.Context, sg release.Signer, id string, now time.Time) error { o, err := d.Read(ctx) if err != nil { return err } h, ok := o.Roster.Activations[id] if !ok { return nil } floor, err := hostfloor.Read(ctx, d.Store, d.PublicKey, d.Bucket) if err != nil { return err } evidence := ExactEvidence{PublicKey: d.PublicKey, Store: d.Store, Boxes: d.PrivateBoxReport} for actor, enrollment := range h.Actors { ref, ok := strings.CutPrefix(actor, "box:") if !ok { return ErrRoster } box, ok := o.Roster.Boxes[ref] if !ok || box.Enrollment != enrollment { return ErrRoster } excluded, err := d.activationExcluded(ctx, o, ref, box, now) if err != nil { return err } if excluded { continue } r, err := d.PrivateBoxReport(ctx, ref, box) if err != nil { return err } if err = VerifyReport(ctx, evidence, d.PublicKey, floor, r, enrollment, box.Cloud.InstanceID, now); err != nil { return err } if r.ActivationID != id || !r.ActivationComplete || !slices.Contains(h.Hashes[actor], r.BinarySHA256) { return ErrRoster } } next := Clone(o.Roster) delete(next.Activations, id) _, err = d.Replace(ctx, sg, o, next) return err } // activationExcluded applies D7's only exclusions to a reserved actor, the // same ones the census applies: a valid enrollment-qualified termination // fence, or durable quarantine or retirement authority whose root-signed // loss records bind this exact enrollment at its current revision. A // silent active actor is never excluded, and any read or validation // failure refuses, leaving the reservation conservatively held. func (d Directory) activationExcluded(ctx context.Context, o Observed, ref string, b Box, now time.Time) (bool, error) { fenced, err := d.TerminationFence(ctx, o, ref, now) if err != nil { return false, err } if fenced { return true, nil } if b.State == "active" { return false, nil } if len(b.LossIDs) == 0 || b.QuarantineRevision == 0 { return false, ErrRoster } found := false for _, id := range b.LossIDs { loss, err := hostclaim.ReadLossRecord(ctx, d.Store, d.PublicKey, id) if err != nil { return false, err } if loss.Record.Box != ref || loss.Record.Enrollment != b.Enrollment { return false, ErrRoster } if loss.Record.QuarantineRevision == b.QuarantineRevision { found = true } } if !found { return false, ErrRoster } return true, nil }