Versions in this module Expand all Collapse all v0 v0.8.0 Aug 3, 2026 Changes in this version + const CodeAuditTamper + const CodeCapabilityExpired + const CodeCapabilityInvalid + const CodeCapabilityRevoked + const CodeDeadlineExceeded + const CodeEpochOverflow + const CodeExecDenied + const CodeForbidden + const CodeGuardDenied + const CodeInvalidArgument + const CodeLockdownActive + const CodeMaintenanceActive + const CodeQuarantined + const CodeRateLimited + const CodeReplay + const CodeUnauthorized + var ErrAlreadyOwner = errors.New("shiftlock: already claim owner") + var ErrAmbiguous = errors.New("shiftlock: ambiguous backend outcome") + var ErrAuditTamper = errors.New("shiftlock: audit chain tamper detected") + var ErrBackend = errors.New("shiftlock: backend error") + var ErrCanceled = errors.New("shiftlock: canceled") + var ErrCapability = errors.New("shiftlock: backend capability mismatch") + var ErrCapabilityToken = errors.New("shiftlock: capability token invalid") + var ErrClaimHeld = errors.New("shiftlock: claim held by another generation") + var ErrClaimNotFound = errors.New("shiftlock: claim not found") + var ErrClaimUnavailable = errors.New("shiftlock: claim unavailable") + var ErrClosed = errors.New("shiftlock: coordinator closed") + var ErrConcurrentTransfer = errors.New("shiftlock: concurrent transfer conflict") + var ErrDraining = errors.New("shiftlock: draining in progress") + var ErrExecDenied = errors.New("shiftlock: exec denied") + var ErrForbidden = errors.New("shiftlock: forbidden") + var ErrGenerationFailed = errors.New("shiftlock: generation failed") + var ErrGenerationNotFound = errors.New("shiftlock: generation not found") + var ErrGenerationRetired = errors.New("shiftlock: generation retired") + var ErrGuardDenied = errors.New("shiftlock: guard denied") + var ErrHandoffAborted = errors.New("shiftlock: handoff aborted") + var ErrInvalidState = errors.New("shiftlock: invalid state transition") + var ErrLeaseLost = errors.New("shiftlock: lease lost") + var ErrLockdown = errors.New("shiftlock: lockdown active") + var ErrMaintenance = errors.New("shiftlock: maintenance active") + var ErrNoTransfer = errors.New("shiftlock: no pending transfer") + var ErrNotOwner = errors.New("shiftlock: not claim owner") + var ErrNotReady = errors.New("shiftlock: readiness gates not satisfied") + var ErrPolicy = errors.New("shiftlock: policy validation failed") + var ErrQuarantined = errors.New("shiftlock: generation quarantined") + var ErrRateLimited = errors.New("shiftlock: rate limited") + var ErrReplay = errors.New("shiftlock: replay detected") + var ErrRuntimeClosed = errors.New("shiftlock: runtime closed") + var ErrSecurityEpochOverflow = errors.New("shiftlock: security epoch overflow") + var ErrSplitBrain = errors.New("shiftlock: split-brain detected") + var ErrStaleToken = errors.New("shiftlock: stale fencing token") + var ErrTimeout = errors.New("shiftlock: operation timed out") + var ErrTokenOverflow = errors.New("shiftlock: fencing token overflow") + var ErrTransferFailed = errors.New("shiftlock: transfer failed") + var ErrTransferPending = errors.New("shiftlock: transfer already pending") + var ErrUnauthorized = errors.New("shiftlock: unauthorized") + func DiagnosticsHandler(c *Coordinator) http.Handler + func IsPrivileged(p Permission) bool + func ValidateCapabilities(cfg Config, caps Capabilities) error + func WithLocalState(ls LocalStateConfig) func(*RuntimeConfig) + func WithLocalStateDir(dir string) func(*RuntimeConfig) + type AbortRequest struct + ClaimName string + ExpectedToken FencingToken + FromGeneration string + OperationID OperationID + ToGeneration string + type AcquireRequest struct + AllowEmptyOnly bool + ClaimName string + GenerationID string + OperationID OperationID + TTL time.Duration + type Backend interface + AbortTransfer func(ctx context.Context, req AbortRequest) (*ClaimRecord, error) + AcquireClaim func(ctx context.Context, req AcquireRequest) (*ClaimRecord, error) + Close func() error + CommitTransfer func(ctx context.Context, req CommitRequest) (*ClaimRecord, error) + GetClaim func(ctx context.Context, claimName string) (*ClaimRecord, error) + GetGeneration func(ctx context.Context, generationID string) (*Generation, error) + PrepareTransfer func(ctx context.Context, req TransferRequest) (*ClaimRecord, error) + RegisterGeneration func(ctx context.Context, gen Generation) error + ReleaseClaim func(ctx context.Context, req ReleaseRequest) error + RenewClaim func(ctx context.Context, req RenewRequest) (*ClaimRecord, error) + UpdateGeneration func(ctx context.Context, gen Generation) error + WatchClaim func(ctx context.Context, claimName string) (<-chan ClaimEvent, error) + type BarrierFacade struct + func (f *BarrierFacade) New(name string, cfg barrier.Config) (*barrier.Barrier, error) + type Capabilities struct + AtomicCAS bool + DurableStorage bool + ExpireBeforeMutate bool + GlobalExclusive bool + IdempotentMutations bool + MaxFencingToken FencingToken + RenewDuringReserved bool + WatchSupported bool + func DefaultMemoryCapabilities() Capabilities + type Capabler interface + Capabilities func() Capabilities + type Claim struct + func (c *Claim) DrainGroup() *DrainGroup + func (c *Claim) FencingToken() FencingToken + func (c *Claim) Name() string + func (c *Claim) Ownership() Ownership + func (c *Claim) Release(ctx context.Context) error + func (c *Claim) TryAcquire(ctx context.Context) (*Lease, error) + func (c *Claim) WaitForOwnership(ctx context.Context) (*Lease, error) + type ClaimEvent struct + Claim ClaimRecord + Reason TransitionReason + Time time.Time + type ClaimPhase string + const ClaimDraining + const ClaimOwned + const ClaimReserved + const ClaimUnowned + type ClaimRecord struct + AcquiredAt time.Time + DrainStatus string + ExpiresAt time.Time + FencingToken FencingToken + LastHeartbeat time.Time + Name string + OwnerGeneration string + PendingSuccessor string + Phase ClaimPhase + PreviousOwner string + Reason TransitionReason + TransferStatus string + Version uint64 + func (r *ClaimRecord) ToOwnership() Ownership + type Clock interface + After func(d time.Duration) <-chan time.Time + NewTicker func(d time.Duration) Ticker + Now func() time.Time + Since func(t time.Time) time.Duration + type CommitRequest struct + ClaimName string + ExpectedToken FencingToken + FromGeneration string + OperationID OperationID + TTL time.Duration + ToGeneration string + type Config struct + AcquireInterval time.Duration + Backend Backend + Clock Clock + DrainTimeout time.Duration + EventBuffer int + GenerationID string + Hooks []Hook + InstanceID string + LeaseTTL time.Duration + Observers []Observer + Policy Policy + ReadinessTimeout time.Duration + RenewInterval time.Duration + Service string + TransferTimeout time.Duration + WatchBuffer int + type Coordinator struct + func New(cfg Config) (*Coordinator, error) + func (c *Coordinator) Capabilities() Capabilities + func (c *Coordinator) Claim(ctx context.Context, name string) (*Claim, error) + func (c *Coordinator) Close() error + func (c *Coordinator) Config() Config + func (c *Coordinator) DetectSplitBrain(ctx context.Context, claimName string) (*SplitBrainReport, error) + func (c *Coordinator) Diagnostics() Diagnostics + func (c *Coordinator) EventDropped() uint64 + func (c *Coordinator) Generation() Generation + func (c *Coordinator) Health(_ context.Context) HealthReport + func (c *Coordinator) LastHeartbeat() time.Time + func (c *Coordinator) PlanRecovery(ctx context.Context, claim string) (*RecoveryPlan, error) + func (c *Coordinator) PrepareHandoff(ctx context.Context) (*Handoff, error) + func (c *Coordinator) Run(ctx context.Context, worker Worker) error + type DegradationPolicy string + const DegradeContinueUntilMargin + const DegradeFailClosed + const DegradeFinishCurrentOnly + const DegradeImmediateStop + type Diagnostics struct + Capabilities Capabilities + Claims []Ownership + EventDropped uint64 + Generation Generation + InstanceID string + LastHeartbeat time.Time + Service string + type DrainGroup struct + func NewDrainGroup(maxNamed int) *DrainGroup + func (g *DrainGroup) Active() int + func (g *DrainGroup) Begin() (func(), error) + func (g *DrainGroup) BeginNamed(name string) (func(), error) + func (g *DrainGroup) Close() + func (g *DrainGroup) Draining() bool + func (g *DrainGroup) SetDeadline(ch <-chan struct{}) + func (g *DrainGroup) StartDrain() + func (g *DrainGroup) Wait(ctx context.Context) error + type ElectionFacade struct + func (f *ElectionFacade) Join(ctx context.Context, name string) (*election.Election, error) + type Error struct + Category ErrorCategory + Claim string + Code string + Err error + Gen string + Message string + Op string + Reason TransitionReason + Token FencingToken + func (e *Error) Error() string + func (e *Error) Is(target error) bool + func (e *Error) PublicMessage() string + func (e *Error) Unwrap() error + type ErrorCategory string + const CategoryAudit + const CategoryAuthorization + const CategoryBackend + const CategoryCapability + const CategoryGeneral + const CategoryLockdown + const CategoryMaintenance + const CategoryOwnership + const CategoryPolicy + const CategoryQuarantine + const CategorySecurity + type Event struct + Attrs map[string]string + Claim string + Err string + FromState GenerationState + Generation string + InstanceID string + Reason TransitionReason + Service string + Time time.Time + ToState GenerationState + Token FencingToken + Type EventType + type EventFilter func(Event) bool + type EventType string + const EventBackendHeartbeat + const EventClaimAcquired + const EventClaimExpired + const EventClaimLost + const EventClaimReleased + const EventClaimRenewed + const EventClosed + const EventDrainCompleted + const EventDrainFailed + const EventDrainStarted + const EventError + const EventGenerationRegistered + const EventGenerationState + const EventHandoffCompleted + const EventHandoffFailed + const EventHandoffStarted + const EventLeaseRevoked + const EventReadinessFailed + const EventReadinessPassed + const EventReadinessStarted + const EventTransferAborted + const EventTransferCommitted + const EventTransferPrepared + type FeatureFlags struct + AntiReplay bool + Audit bool + Capabilities bool + Commands bool + Exec bool + Guard bool + Lockdown bool + Maintenance bool + Resources bool + Supervisor bool + Workflows bool + type FencedClaims struct + RT *Runtime + func (f FencedClaims) Acquire(ctx context.Context, claim string) (uint64, error) + func (f FencedClaims) Release(ctx context.Context, claim string, _ uint64) error + func (f FencedClaims) Renew(_ context.Context, claim string, token uint64) error + type FencingToken uint64 + const MaxSafeFencingToken + func (t FencingToken) Less(other FencingToken) bool + func (t FencingToken) Zero() bool + type Gate struct + Check func(ctx context.Context) error + Name string + Optional bool + Required bool + Retries int + RetryDelay time.Duration + StableSuccesses int + Timeout time.Duration + type GateMode int + const GateParallel + const GateSequential + type GateReport struct + Attempts int + Duration time.Duration + Err string + Name string + Passed bool + Required bool + type Generation struct + ID string + InstanceID string + Reason TransitionReason + Service string + StartedAt time.Time + State GenerationState + UpdatedAt time.Time + func (g Generation) Clone() Generation + type GenerationState string + const StateActive + const StateDraining + const StateFailed + const StateJoining + const StatePreparing + const StateRetired + const StateStandby + const StateTransferring + func (s GenerationState) Terminal() bool + func (s GenerationState) Valid() bool + type Handoff struct + func (h *Handoff) Abort(ctx context.Context) error + func (h *Handoff) Commit(ctx context.Context) error + func (h *Handoff) Drain(ctx context.Context) error + func (h *Handoff) Status() HandoffStatus + func (h *Handoff) Transfer(ctx context.Context, successorGenerationID string) error + type HandoffStatus string + const HandoffAborted + const HandoffCommitted + const HandoffDraining + const HandoffFailed + const HandoffPending + const HandoffTransferring + type HealthReport struct + Backend HealthStatus + Coordinator HealthStatus + Degradation DegradationPolicy + Details map[string]string + Ownership HealthStatus + Process HealthStatus + Readiness HealthStatus + Time time.Time + type HealthStatus string + const HealthDegraded + const HealthFailing + const HealthOK + const HealthUnknown + type Hook func(Event) + type Lease struct + func (l *Lease) Context() context.Context + func (l *Lease) FencingToken() FencingToken + func (l *Lease) Ownership() Ownership + func (l *Lease) Valid() bool + type LocalStateConfig struct + Dir string + MaxInstances int + Mode LocalStateMode + WorkflowPath string + type LocalStateMode string + const LocalStateDir + const LocalStateFile + const LocalStateMemory + type Observer interface + OnEvent func(Event) + type ObserverFunc func(Event) + func (f ObserverFunc) OnEvent(e Event) + type OperationID string + func (id OperationID) Empty() bool + type Ownership struct + AcquiredAt time.Time + ClaimName string + DrainStatus string + ExpiresAt time.Time + FencingToken FencingToken + LastHeartbeat time.Time + OwnerGeneration string + PendingSuccessor string + Phase ClaimPhase + PreviousOwner string + Reason TransitionReason + TransferStatus string + func (o Ownership) Clone() Ownership + func (o Ownership) Controls(genID string) bool + func (o Ownership) OwnedBy(genID string) bool + type Permission string + const PermAuditRead + const PermCapabilityIssue + const PermCapabilityRevoke + const PermClaimAcquire + const PermClaimForceRelease + const PermClaimRelease + const PermCommandInvoke + const PermCommandRegister + const PermElectionJoin + const PermElectionResign + const PermExecRun + const PermLockdownEnter + const PermLockdownExit + const PermMaintenanceEnter + const PermMaintenanceExit + const PermQuorumVote + const PermRecoveryAct + const PermTaskRestart + const PermTaskStart + const PermTaskStop + type Policy struct + AllowForceRelease bool + AllowLocalDegradation bool + FailClosedOnAmbiguous bool + MaxConcurrentClaims int + MaxLeaseTTL time.Duration + MinLeaseTTL time.Duration + RejectStaleRelease bool + RequireDurable bool + RequireGlobalExclusive bool + RequireIdempotent bool + RequireRenewBelowTTL bool + func (p Policy) Validate(cfg Config) error + type Principal struct + Attrs map[string]string + Generation string + ID string + Kind PrincipalKind + type PrincipalKind string + const PrincipalCapability + const PrincipalGeneration + const PrincipalOperator + const PrincipalService + const PrincipalSystem + type QuorumFacade struct + func (f *QuorumFacade) New(name string, maxParticipants int) (*barrier.Barrier, error) + type Readiness struct + Clock Clock + Gates []Gate + Mode GateMode + Timeout time.Duration + func (r Readiness) Run(ctx context.Context) (ReadinessReport, error) + type ReadinessReport struct + Duration time.Duration + Gates []GateReport + Passed bool + type RecoveryFacade struct + func (f *RecoveryFacade) Plan(ctx context.Context, claim string) (*RecoveryPlan, error) + type RecoveryPlan struct + Claim string + ExpectedOwner string + ExpectedToken FencingToken + Recommended []string + RequiresConfirm bool + Situation string + type ReleaseRequest struct + ClaimName string + GenerationID string + OperationID OperationID + Token FencingToken + type RenewRequest struct + ClaimName string + GenerationID string + OperationID OperationID + TTL time.Duration + Token FencingToken + type ReplayCache struct + func NewReplayCache(maxEntries int, clock Clock) *ReplayCache + func (c *ReplayCache) CheckAndStore(key string, ttl time.Duration) error + func (c *ReplayCache) Len() int + func (c *ReplayCache) Seen(key string) bool + type Runtime struct + func NewRuntime(cfg RuntimeConfig) (*Runtime, error) + func (r *Runtime) AllowElection(_ string) error + func (r *Runtime) AllowTask(spec supervise.Spec) error + func (r *Runtime) Audit() *audit.Store + func (r *Runtime) AuditCommand(actor, name, decision, outcome string) + func (r *Runtime) AuthorizeCommand(actor, name, permission string) error + func (r *Runtime) Barrier() *BarrierFacade + func (r *Runtime) Capabilities() *capability.Authority + func (r *Runtime) Claims() *Coordinator + func (r *Runtime) Close() error + func (r *Runtime) Commands() *command.Registry + func (r *Runtime) Coordinator() *Coordinator + func (r *Runtime) Election() *ElectionFacade + func (r *Runtime) EnterQuarantine(reason string) + func (r *Runtime) ExecGuard() *execguard.Guard + func (r *Runtime) Failover() *failover.Manager + func (r *Runtime) Features() FeatureFlags + func (r *Runtime) Guard() *guard.Engine + func (r *Runtime) Health(ctx context.Context) health.Report + func (r *Runtime) IssueCapability(req capability.Request) (capability.Token, error) + func (r *Runtime) LocalStateDir() string + func (r *Runtime) Lockdown() *lockdown.Manager + func (r *Runtime) Maintenance() *maintenance.Manager + func (r *Runtime) Migrations() *migration.Coordinator + func (r *Runtime) Quarantined() bool + func (r *Runtime) Quorum() *QuorumFacade + func (r *Runtime) Recovery() *RecoveryFacade + func (r *Runtime) Replay() *ReplayCache + func (r *Runtime) Resources() *resource.Registry + func (r *Runtime) Security() SecuritySettings + func (r *Runtime) SecurityEpoch() SecurityEpoch + func (r *Runtime) Supervisor() *supervise.Supervisor + func (r *Runtime) Sync() *syncpkg.Engine + func (r *Runtime) TriggerSplitBrainLockdown(claim string) + func (r *Runtime) VerifyAudit() error + func (r *Runtime) Workflows() *workflow.Engine + type RuntimeConfig struct + ApplySecurityOverridesBooleans bool + AuditStore *audit.Store + CapabilityOptions []capability.Option + EnableAudit bool + EnableCapabilities bool + EnableCommands bool + EnableGuard bool + EnableLockdown bool + EnableMaintenance bool + EnableResources bool + EnableSupervisor bool + EnableWorkflows bool + LocalState *LocalStateConfig + LockdownEvidencePath string + LockdownPath string + MaintenancePath string + MaxResources int + SecurityEpoch SecurityEpoch + SecurityOverrides *SecuritySettings + SecurityProfile SecurityProfile + type SecurityEpoch uint64 + const MaxSecurityEpoch + func (e SecurityEpoch) Next() (SecurityEpoch, error) + type SecurityProfile string + const ProfileDevelopment + const ProfileHardened + const ProfileMaximumSecurity + const ProfileStandard + const ProfileTesting + type SecuritySettings struct + AllowExec bool + AntiReplayEnabled bool + AntiReplayMaxEntries int + AuditEnabled bool + AuditFailClosed bool + CapabilityDefaultTTL time.Duration + CapabilityMaxTTL time.Duration + CommandFloodThreshold int + CommandFloodWindow time.Duration + DefaultCommandDeadline time.Duration + DenyPrivilegedByDefault bool + LockdownOnAuditTamper bool + LockdownOnCommandFlood bool + LockdownOnSplitBrain bool + MaxCommandBodyBytes int + Profile SecurityProfile + QuarantineOnTamper bool + RequireCapabilityForPrivileged bool + RequireSingleUseCapabilities bool + func ExpandSecurityProfile(p SecurityProfile) SecuritySettings + func MergeSecurity(base SecuritySettings, overlay SecuritySettings) SecuritySettings + type SplitBrainReport struct + ActionTaken string + BackendOwner string + BackendToken FencingToken + Claim string + DetectedAt time.Time + LocalOwner string + LocalToken FencingToken + type Ticker interface + C func() <-chan time.Time + Stop func() + type TokenValidator struct + func NewTokenValidator() *TokenValidator + func (v *TokenValidator) Accept(token FencingToken) bool + func (v *TokenValidator) Current() FencingToken + type TransferRequest struct + ClaimName string + FromGeneration string + OperationID OperationID + TTL time.Duration + ToGeneration string + Token FencingToken + type TransitionReason string + const ReasonAcquired + const ReasonClosed + const ReasonDrainComplete + const ReasonDrainStarted + const ReasonExpired + const ReasonFailed + const ReasonFencedOut + const ReasonPartition + const ReasonReadinessFailed + const ReasonReadinessPassed + const ReasonRegistered + const ReasonReleased + const ReasonRenewed + const ReasonRetired + const ReasonRollback + const ReasonTimeout + const ReasonTransferAborted + const ReasonTransferCommitted + const ReasonTransferPrepared + type Worker struct + Name string + Readiness *Readiness + Run func(ctx context.Context, ownership *Lease) error