runtime

package
v0.16.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 4, 2026 License: AGPL-3.0 Imports: 24 Imported by: 0

README

runtime

import "github.com/agentstation/starmap/runtime"

Package runtime holds the connected catalog runtime. It opens a Starmap client, reads verified upstream generations from one source, publishes each accepted generation, and reports the operator-facing status of that work.

The default source is the attested public GitHub channel. A caller that opens the runtime accepts the signature verification and the network reads that this channel needs. The root starmap package stays the offline library.

Index

Constants

Lease timing. One holder renews well inside the expiry, so a short pause never drops the lease and a stopped holder expires quickly.

const (
    // LeaseTTL bounds how long one lease stays valid without a renewal.
    LeaseTTL = 90 * time.Second

    // LeaseRenewInterval is the period between renewals.
    LeaseRenewInterval = 30 * time.Second
)

Transfer and refresh defaults. They match the canonical CATALOG_TRANSFER_* and CATALOG_REFRESH_TIMEOUT settings.

const (
    // DefaultTransferIdleTimeout bounds a stalled transfer.
    DefaultTransferIdleTimeout = 2 * time.Minute

    // DefaultTransferMaxDuration bounds one whole transfer.
    DefaultTransferMaxDuration = 60 * time.Minute

    // DefaultRefreshTimeout is zero, so a refresh carries no deadline of its
    // own. Transfer bounds and caller cancellation stop a stalled run.
    DefaultRefreshTimeout time.Duration = 0

    // DefaultCoalesceWindow bounds how long completed provider observations
    // wait for a slower sibling before they publish.
    DefaultCoalesceWindow = 30 * time.Second
)

Source policy defaults. They match the canonical CATALOG_SOURCE_* settings.

const (
    // DefaultSourceRepository is the public catalog repository.
    DefaultSourceRepository = "agentstation/starmap"

    // DefaultSourceChannel is the mutable branch that names the current
    // immutable catalog release.
    DefaultSourceChannel = "catalog/v1"

    // DefaultSourcePollInterval is how often the runtime checks the channel.
    DefaultSourcePollInterval = time.Hour

    // DefaultSourceMaxAge is the age at which a served catalog is stale.
    DefaultSourceMaxAge = 6 * time.Hour

    // DefaultSourceMaxHops bounds a cascade of Starmap runtimes.
    DefaultSourceMaxHops = 8

    // MaxSourceAliases bounds the declared alias list. A deployment names a
    // few addresses of one node, so a longer list is a configuration error.
    MaxSourceAliases = 16

    // MaxSourceAliasBytes bounds one declared alias.
    MaxSourceAliasBytes = 128
)

Freshness thresholds. They follow the four-hour publication cadence, the one-hour channel poll, and the six-hour end-to-end objective.

const (
    // FreshnessChannelWarnAge is the served-catalog age that warns. A source
    // maximum age above zero replaces it, unless the caller supplies an
    // explicit freshness policy.
    FreshnessChannelWarnAge = 6 * time.Hour

    // FreshnessChannelCriticalAge is the served-catalog age that is critical.
    // A source maximum age above zero replaces it with the scaled age, unless
    // the caller supplies an explicit freshness policy.
    FreshnessChannelCriticalAge = 10 * time.Hour

    // FreshnessSourceCheckWarnAge is the source-check age that warns.
    FreshnessSourceCheckWarnAge = 90 * time.Minute

    // FreshnessSourceCheckCriticalAge is the source-check age that is critical.
    FreshnessSourceCheckCriticalAge = 2 * time.Hour

    // FreshnessAcquisitionWarnAge is the acquisition-success age that warns.
    FreshnessAcquisitionWarnAge = 5 * time.Hour

    // FreshnessAcquisitionCriticalAge is the acquisition-success age that is
    // critical.
    FreshnessAcquisitionCriticalAge = 8 * time.Hour
)

Fallback reasons. They say why the runtime still serves the verified embedded catalog instead of an upstream generation.

const (
    // FallbackNone means an upstream generation is active.
    FallbackNone = ""

    // FallbackAwaitingSource means no upstream reply arrived yet.
    FallbackAwaitingSource = "awaiting_source"

    // FallbackSourceUnavailable means every source read failed so far.
    FallbackSourceUnavailable = "source_unavailable"
)

Source kinds. Selection is terminal, so a deployment that names a custom source never falls back to the public GitHub channel.

const (
    // SourcePublic reads the attested public GitHub catalog channel.
    SourcePublic = status.SourcePublic

    // SourceGitHub reads an attested channel from a named repository.
    SourceGitHub = status.SourceGitHub

    // SourceStarmap reads from another Starmap runtime.
    SourceStarmap = status.SourceStarmap

    // SourceFile reads one immutable generation from a local path.
    SourceFile = status.SourceFile

    // SourceEmbedded pins the runtime to the verified embedded bootstrap.
    SourceEmbedded = status.SourceEmbedded
)

Freshness grades of one observed timestamp.

const (
    // FreshnessUnknown means no observation supports an evaluation yet.
    FreshnessUnknown = status.FreshnessUnknown

    // FreshnessCurrent means the age is inside every threshold.
    FreshnessCurrent = status.FreshnessCurrent

    // FreshnessWarn means the age passed the warning threshold.
    FreshnessWarn = status.FreshnessWarn

    // FreshnessCritical means the age passed the critical threshold.
    FreshnessCritical = status.FreshnessCritical
)

Health states of one runtime component.

const (
    // HealthUnknown means the component has not reported yet.
    HealthUnknown = status.HealthUnknown

    // HealthOK means the component reached its last objective.
    HealthOK = status.HealthOK

    // HealthDegraded means the component works with reduced evidence.
    HealthDegraded = status.HealthDegraded

    // HealthUnavailable means the component cannot reach its dependency.
    HealthUnavailable = status.HealthUnavailable
)

Acquisition policy defaults. Acquisition has exactly two settings: whether it runs, and how often. No start-time or mode setting exists.

const (
    // DefaultAcquisitionInterval is the provider acquisition period.
    DefaultAcquisitionInterval = 4 * time.Hour
)

type Acquirer

Acquirer collects provider observations for the runtime. The root package selects no concrete provider client, so the deployment injects this role. Package acquisition supplies the built-in composition.

type Acquirer interface {
    AcquireProviders(ctx context.Context, request AcquisitionRequest) (AcquisitionResult, error)
}

type AcquisitionPolicy

AcquisitionPolicy configures scheduled provider acquisition. The policy is exactly one switch and one period.

type AcquisitionPolicy struct {
    // Enabled reports whether scheduled provider acquisition runs.
    Enabled bool

    // Interval is the acquisition period. The scheduler places each instance
    // at a stable phase inside the interval. Zero means one startup pass and
    // no periodic work.
    Interval time.Duration
}

func DefaultAcquisitionPolicy
func DefaultAcquisitionPolicy() AcquisitionPolicy

DefaultAcquisitionPolicy returns the canonical acquisition policy.

func (AcquisitionPolicy) Validate
func (p AcquisitionPolicy) Validate() error

Validate checks the acquisition period. Zero is valid and selects one startup pass, so an operator schedules a single run without a cadence.

type AcquisitionReport

AcquisitionReport says what one provider acquisition run produced. A partial failure still publishes: the report names the providers that kept their own last-known-good observation.

type AcquisitionReport struct {
    // RunID is the identity of the run that produced this report.
    RunID string

    // StartedAt and CompletedAt bound the run.
    StartedAt   time.Time
    CompletedAt time.Time

    // Eligible is the number of providers the run considered.
    Eligible int

    // Succeeded, Skipped, and Failed count the terminal attempts.
    Succeeded int
    Skipped   int
    Failed    int

    // Attempts holds one terminal attempt per eligible provider.
    Attempts []sources.ProviderAttempt

    // Published reports whether the runtime published a new effective catalog.
    Published bool

    // GenerationID identifies the published effective catalog.
    GenerationID string

    // Retained names the providers that kept their previous last-known-good
    // observation because this run did not replace it.
    Retained []catalogs.ProviderID

    // Health grades the run. A failed provider degrades the run.
    Health Health
}

type AcquisitionRequest

AcquisitionRequest describes one provider acquisition run.

type AcquisitionRequest struct {
    // RunID is the run identity that logs and status report.
    RunID string

    // Current is the immutable catalog the run starts from.
    Current *catalogs.Catalog

    // Providers restricts the run. An empty list observes every eligible
    // provider.
    Providers []catalogs.ProviderID

    // CoalesceWindow bounds how long completed observations wait for a slower
    // sibling before they publish.
    CoalesceWindow time.Duration

    // Publish emits the layers that completed inside one coalescing window.
    // The runtime retains them, rebuilds the effective catalog, and publishes
    // one generation under the lease epoch of the run. An acquirer that emits
    // nothing early leaves the field unused, and the runtime then publishes
    // every layer once the run returns.
    Publish func(context.Context, []ProviderLayer) error
}

type AcquisitionResult

AcquisitionResult is what one acquisition run observed.

type AcquisitionResult struct {
    // Eligible is the number of providers the run considered.
    Eligible int

    // Attempts holds one terminal attempt per eligible provider.
    Attempts []sources.ProviderAttempt

    // Layers holds one observation per provider that answered.
    Layers []ProviderLayer
}

type Freshness

Freshness is the evaluated age of one observed timestamp.

type Freshness = status.Freshness

type FreshnessPolicy

FreshnessPolicy holds the age thresholds that turn observed timestamps into a freshness level.

type FreshnessPolicy struct {
    ChannelWarnAge     time.Duration
    ChannelCriticalAge time.Duration

    SourceCheckWarnAge     time.Duration
    SourceCheckCriticalAge time.Duration

    AcquisitionWarnAge     time.Duration
    AcquisitionCriticalAge time.Duration
}

func DefaultFreshnessPolicy
func DefaultFreshnessPolicy() FreshnessPolicy

DefaultFreshnessPolicy returns the canonical freshness thresholds.

func (FreshnessPolicy) Validate
func (p FreshnessPolicy) Validate() error

Validate checks that every warning threshold precedes its critical partner.

type Health

Health is the operator-facing state of one runtime component.

type Health = status.Health

type Lease

Lease is the exclusive right to commit a durable catalog generation. The epoch increases on every fresh acquisition, so a commit that carries an older epoch is stale.

type Lease struct {
    // Holder names the instance that owns the lease.
    Holder string

    // Epoch increases on every fresh acquisition.
    Epoch uint64

    // ExpiresAt is when the lease lapses without a renewal.
    ExpiresAt time.Time
}

type LeaseStore

LeaseStore is the shared-storage lease that fences durable commits. A deployment whose instances share no storage needs no lease store, and the runtime then commits without a fence.

type LeaseStore interface {
    // AcquireLease takes the lease for the named holder. A store that another
    // holder owns returns an *errors.ConflictError. That refusal names a
    // non-owner state, not a failure. The runtime keeps serving its retained
    // catalog and tries again at the next run. Every other error fails Open.
    AcquireLease(ctx context.Context, holder string, ttl time.Duration) (Lease, error)

    // Renew extends a held lease. It fails when another holder took the lease.
    Renew(ctx context.Context, lease Lease, ttl time.Duration) (Lease, error)

    // Release returns the lease early.
    Release(ctx context.Context, lease Lease) error
}

type Option

Option configures the connected runtime. The offline constructors in the root package take their own option type, so no offline constructor accepts a connected-runtime setting.

type Option func(*options) error

func WithAcquirer
func WithAcquirer(acquirer Acquirer) Option

WithAcquirer injects the provider acquisition composition. The root package selects no concrete provider client, so a runtime without an acquirer runs source refresh only.

func WithAcquisitionEnabled
func WithAcquisitionEnabled(enabled bool) Option

WithAcquisitionEnabled turns scheduled provider acquisition on or off.

func WithAcquisitionInterval
func WithAcquisitionInterval(interval time.Duration) Option

WithAcquisitionInterval sets the provider acquisition period. Zero selects one startup pass and no periodic work.

func WithCatalogSource
func WithCatalogSource(name string) Option

WithCatalogSource selects the upstream catalog source by name. It accepts public, github, starmap, file, and embedded. A named custom source is terminal: the runtime never falls back to the public channel.

func WithClientOptions
func WithClientOptions(opts ...starmap.Option) Option

WithClientOptions forwards offline client options to the Starmap client that the runtime publishes into. The root package owns the catalog store, the workspace path, and the embedded bootstrap budgets. One composition therefore supplies both kinds of setting in one list.

func WithClock
func WithClock(now func() time.Time) Option

WithClock injects the runtime clock. Tests use it to keep timing exact.

func WithCoalesceWindow
func WithCoalesceWindow(window time.Duration) Option

WithCoalesceWindow bounds how long completed provider observations wait for a slower sibling before they publish.

func WithFreshnessPolicy
func WithFreshnessPolicy(policy FreshnessPolicy) Option

WithFreshnessPolicy replaces the freshness thresholds. An explicit policy wins, so WithSourceMaxAge then derives no channel threshold.

func WithLeaseStore
func WithLeaseStore(store LeaseStore) Option

WithLeaseStore injects the shared-storage lease that fences durable commits. A deployment without shared storage needs no lease.

func WithListenAddress
func WithListenAddress(address string) Option

WithListenAddress records the server listen address. It separates two instances that share a copied state directory.

func WithRandom
func WithRandom(random Random) Option

WithRandom injects the jitter source that spreads scheduled work.

func WithRefreshTimeout
func WithRefreshTimeout(timeout time.Duration) Option

WithRefreshTimeout bounds one whole refresh run. Zero, the default, adds no deadline, so a long transfer inside its own bounds is not cut short.

func WithSchedulerIdentity
func WithSchedulerIdentity(identity string) Option

WithSchedulerIdentity overrides the derived instance identity. Use it when the deployment already owns a stable instance name.

func WithSource
func WithSource(source Source) Option

WithSource injects a deployment-owned upstream source. It replaces every built-in source implementation.

func WithSourceAPIKey
func WithSourceAPIKey(key string) Option

WithSourceAPIKey supplies the source API key. The runtime keeps the key out of status, logs, and errors.

func WithSourceAliases
func WithSourceAliases(aliases ...string) Option

WithSourceAliases declares the other stable identities that name this same runtime. A served source chain that names one of them is a self reference. The runtime then refuses the read instead of serving its own catalog back to itself.

func WithSourceChannel
func WithSourceChannel(channel string) Option

WithSourceChannel names the mutable branch that selects the current catalog.

func WithSourceMaxAge
func WithSourceMaxAge(maxAge time.Duration) Option

WithSourceMaxAge sets the age at which the served catalog counts as stale. It also derives the channel freshness thresholds. The warning age becomes the maximum age, and the critical age keeps the six-to-ten ratio of the defaults. WithFreshnessPolicy wins over this derivation.

func WithSourceMaxHops
func WithSourceMaxHops(hops int) Option

WithSourceMaxHops bounds a cascade of Starmap runtimes.

func WithSourcePolicy
func WithSourcePolicy(policy SourcePolicy) Option

WithSourcePolicy replaces the whole upstream source policy.

func WithSourcePollInterval
func WithSourcePollInterval(interval time.Duration) Option

WithSourcePollInterval sets the channel check period.

func WithSourceRepository
func WithSourceRepository(repository string) Option

WithSourceRepository names the catalog repository of a GitHub channel.

func WithSourceSignerWorkflow
func WithSourceSignerWorkflow(workflow string) Option

WithSourceSignerWorkflow pins the build provenance the source accepts.

func WithSourceStartupPolicy
func WithSourceStartupPolicy(name string) Option

WithSourceStartupPolicy decides what the runtime serves before the first upstream reply.

func WithSourceToken
func WithSourceToken(token string) Option

WithSourceToken supplies the source access token. The runtime keeps the token out of status, logs, and errors.

func WithSourceURL
func WithSourceURL(url string) Option

WithSourceURL sets the deployment-owned source address used by the starmap and file sources.

func WithStartupSpread
func WithStartupSpread(spread time.Duration) Option

WithStartupSpread bounds the random delay before the first scheduled run.

func WithStateDirectory
func WithStateDirectory(directory string) Option

WithStateDirectory selects the durable directory that retains layers, the scheduler identity seed, and source discovery state.

func WithTransferIdleTimeout
func WithTransferIdleTimeout(timeout time.Duration) Option

WithTransferIdleTimeout bounds a stalled transfer.

func WithTransferMaxDuration
func WithTransferMaxDuration(duration time.Duration) Option

WithTransferMaxDuration bounds one whole transfer.

type ProviderLayer

ProviderLayer is one retained per-provider observation. The runtime keeps the last-known-good layer of every provider, so one failing provider never removes its records from the effective catalog.

type ProviderLayer struct {
    // ProviderID names the observed provider.
    ProviderID catalogs.ProviderID

    // Payload is the canonical encoding of the provider observation.
    Payload []byte

    // Digest is the content digest of Payload.
    Digest string

    // ObservedAt is when acquisition accepted the observation.
    ObservedAt time.Time
}

type Random

Random returns a uniform value in the half-open interval [0, 1). The runtime uses it to spread scheduled work across a fleet.

type Random func() float64

type RefreshReport

RefreshReport says what one whole refresh produced. A source-only run leaves the acquisition report empty, and an acquisition-only run leaves the source report empty.

type RefreshReport struct {
    // RunID is the identity of the run.
    RunID string

    // Kind names the work the run did.
    Kind string

    // StartedAt and CompletedAt bound the run.
    StartedAt   time.Time
    CompletedAt time.Time

    // Source reports the upstream read.
    Source SourceRefreshReport

    // Acquisition reports the provider observations.
    Acquisition AcquisitionReport

    // Published reports whether the runtime published a new effective catalog.
    Published bool

    // GenerationID identifies the published effective catalog.
    GenerationID string
}

type Runtime

Runtime is a connected Starmap. It serves the embedded catalog immediately, refreshes from one selected upstream source, retains per-provider observations, and rebuilds one immutable effective catalog from those layers. Reads reach no external system.

type Runtime struct {
    // contains filtered or unexported fields
}

func Open
func Open(ctx context.Context, opts ...Option) (*Runtime, error)

Open returns a connected runtime. It serves the verified embedded catalog before the first upstream reply, so Catalog and State never wait for the network. Open starts the source and acquisition schedules and returns.

func (*Runtime) Catalog
func (r *Runtime) Catalog() *catalogs.Catalog

Catalog returns the current immutable effective catalog. It reaches no external system and never blocks on the source.

func (*Runtime) Client
func (r *Runtime) Client() *starmap.Client

Client returns the immutable publication client underneath the runtime. Use it for explicit publication, hooks, and generation retrieval.

func (*Runtime) Close
func (r *Runtime) Close() error

Close stops runtime-owned work and releases the lease. It is idempotent and joins within five seconds. A run that does not stop in time leaves a typed timeout error, so an operator sees the stall rather than a silent hang.

func (*Runtime) Refresh
func (r *Runtime) Refresh(ctx context.Context) (RefreshReport, error)

Refresh reads the upstream source and then observes every eligible provider. It changes the source layer and the provider layers in one run.

func (*Runtime) RefreshSource
func (r *Runtime) RefreshSource(ctx context.Context) (SourceRefreshReport, error)

RefreshSource reads the upstream source only. It changes the source layer.

func (*Runtime) State
func (r *Runtime) State() starmap.CatalogState

State returns one atomic snapshot of the effective catalog and its generation identity. It reaches no external system.

func (*Runtime) Status
func (r *Runtime) Status() Status

Status returns the current runtime status. It reads retained state only, so it reaches no external system and never blocks on the source.

func (*Runtime) Sync
func (r *Runtime) Sync(ctx context.Context, providers ...catalogs.ProviderID) (AcquisitionReport, error)

Sync observes providers only. It changes the provider layers and returns the acquisition report. An empty provider list observes every eligible provider.

func (*Runtime) Updates
func (r *Runtime) Updates() <-chan starmap.CatalogState

Updates returns the channel that carries every published effective catalog state. The runtime buffers the channel. A reader that falls behind loses intermediate states and always observes the newest one.

type Source

Source reads one upstream immutable catalog generation.

type Source = source.Source

type SourceHop

SourceHop is one sanitized entry in an upstream source chain.

type SourceHop = status.SourceHop

type SourceIdentityAdopter

SourceIdentityAdopter is an optional Source that takes the fleet instance identity of its runtime.

type SourceIdentityAdopter = source.IdentityAdopter

type SourceKind

SourceKind names one supported upstream catalog source.

type SourceKind = status.SourceKind

func ParseSourceKind
func ParseSourceKind(name string) (SourceKind, error)

ParseSourceKind converts one configured name into a source kind. It rejects every unknown name with a typed validation error, so a typo never selects a silent default.

func SourceKinds
func SourceKinds() []SourceKind

SourceKinds returns a caller-owned copy of every accepted source name.

type SourcePolicy

SourcePolicy selects and bounds the upstream catalog source. It holds no token and no API key, so a policy value is safe to log and to serve.

type SourcePolicy struct {
    // Kind selects the source implementation.
    Kind SourceKind

    // URL is the deployment-owned source address. It applies to the starmap
    // and file kinds.
    URL string

    // Repository names the catalog repository for the public and github kinds.
    Repository string

    // Channel names the mutable branch that selects the current catalog.
    Channel string

    // SignerWorkflow pins the build provenance the source accepts.
    SignerWorkflow string

    // PollInterval is the channel check period.
    PollInterval time.Duration

    // StartupPolicy decides what the runtime serves before the first reply.
    StartupPolicy StartupPolicy

    // MaxAge is the age at which the active catalog counts as stale.
    MaxAge time.Duration

    // MaxHops bounds a cascade of Starmap runtimes.
    MaxHops int

    // Aliases are the other stable identities that name this same runtime,
    // such as a load-balancer name or a second deployment name. A served
    // source chain that names one of them is a self reference, and address
    // comparison alone cannot detect it.
    Aliases []string
}

func DefaultSourcePolicy
func DefaultSourcePolicy() SourcePolicy

DefaultSourcePolicy returns the canonical public-channel source policy.

func (SourcePolicy) SafeIdentity
func (p SourcePolicy) SafeIdentity() string

SafeIdentity returns the source identity that status and logs may show. It names the kind and, for a GitHub channel, the repository and the channel. It never names a custom URL, a host, or a credential.

func (SourcePolicy) Validate
func (p SourcePolicy) Validate() error

Validate checks the policy fields that the runtime depends on.

type SourceRead

SourceRead is one upstream observation.

type SourceRead = source.Read

type SourceRefreshReport

SourceRefreshReport says what one upstream source read produced.

type SourceRefreshReport struct {
    // RunID is the identity of the run that produced this report.
    RunID string

    // StartedAt and CompletedAt bound the run.
    StartedAt   time.Time
    CompletedAt time.Time

    // SourceIdentity is the safe identity of the source that answered.
    SourceIdentity string

    // Changed reports whether the upstream generation moved.
    Changed bool

    // Published reports whether the runtime published a new effective catalog.
    Published bool

    // GenerationID identifies the upstream generation the runtime retained.
    GenerationID string

    // PublishedAt is the upstream publication time.
    PublishedAt time.Time

    // Health is what this runtime observed while it read the source. It grades
    // the transfer only.
    Health Health

    // UpstreamHealth is the health the upstream reported about itself. It stays
    // independent of Health, so a healthy transfer still carries a degraded
    // upstream report.
    UpstreamHealth Health

    // Reason is the safe reason code of a failed read.
    Reason string

    // Chain is the sanitized upstream source chain.
    Chain []SourceHop
}

type SourceWatcher

SourceWatcher is an optional Source that reports each upstream change.

type SourceWatcher = source.Watcher

type StartupPolicy

StartupPolicy decides what the runtime serves while the first source read is still outstanding.

type StartupPolicy string

const (
    // StartupPreferSource keeps the embedded baseline active and replaces it
    // with the first verified upstream generation. It is the default.
    StartupPreferSource StartupPolicy = "prefer_source"

    // StartupRequireSource keeps the runtime unusable until one verified
    // upstream generation is active. Open reads the source one time and fails
    // when that read fails. The policy names the evidence the runtime needs,
    // not the lease. A replica that another instance owns therefore opens
    // without a read and consumes the state that the owner publishes.
    StartupRequireSource StartupPolicy = "require_source"

    // StartupPreferLocal keeps the retained local generation active and
    // applies an upstream generation only on an explicit refresh.
    StartupPreferLocal StartupPolicy = "prefer_local"
)

func ParseStartupPolicy
func ParseStartupPolicy(name string) (StartupPolicy, error)

ParseStartupPolicy converts one configured name into a startup policy.

func (StartupPolicy) String
func (p StartupPolicy) String() string

String returns the wire value of the startup policy.

func (StartupPolicy) Valid
func (p StartupPolicy) Valid() bool

Valid reports whether the policy is one of the accepted names.

type Status

Status is the operator-facing state of one connected runtime.

type Status = status.Status

Generated by gomarkdoc

Documentation

Overview

Package runtime holds the connected catalog runtime. It opens a Starmap client, reads verified upstream generations from one source, publishes each accepted generation, and reports the operator-facing status of that work.

The default source is the attested public GitHub channel. A caller that opens the runtime accepts the signature verification and the network reads that this channel needs. The root starmap package stays the offline library.

Index

Constants

View Source
const (
	// LeaseTTL bounds how long one lease stays valid without a renewal.
	LeaseTTL = 90 * time.Second

	// LeaseRenewInterval is the period between renewals.
	LeaseRenewInterval = 30 * time.Second
)

Lease timing. One holder renews well inside the expiry, so a short pause never drops the lease and a stopped holder expires quickly.

View Source
const (
	// DefaultTransferIdleTimeout bounds a stalled transfer.
	DefaultTransferIdleTimeout = 2 * time.Minute

	// DefaultTransferMaxDuration bounds one whole transfer.
	DefaultTransferMaxDuration = 60 * time.Minute

	// DefaultRefreshTimeout is zero, so a refresh carries no deadline of its
	// own. Transfer bounds and caller cancellation stop a stalled run.
	DefaultRefreshTimeout time.Duration = 0

	// DefaultCoalesceWindow bounds how long completed provider observations
	// wait for a slower sibling before they publish.
	DefaultCoalesceWindow = 30 * time.Second
)

Transfer and refresh defaults. They match the canonical CATALOG_TRANSFER_* and CATALOG_REFRESH_TIMEOUT settings.

View Source
const (
	// DefaultSourceRepository is the public catalog repository.
	DefaultSourceRepository = "agentstation/starmap"

	// DefaultSourceChannel is the mutable branch that names the current
	// immutable catalog release.
	DefaultSourceChannel = "catalog/v1"

	// DefaultSourcePollInterval is how often the runtime checks the channel.
	DefaultSourcePollInterval = time.Hour

	// DefaultSourceMaxAge is the age at which a served catalog is stale.
	DefaultSourceMaxAge = 6 * time.Hour

	// DefaultSourceMaxHops bounds a cascade of Starmap runtimes.
	DefaultSourceMaxHops = 8

	// MaxSourceAliases bounds the declared alias list. A deployment names a
	// few addresses of one node, so a longer list is a configuration error.
	MaxSourceAliases = 16

	// MaxSourceAliasBytes bounds one declared alias.
	MaxSourceAliasBytes = 128
)

Source policy defaults. They match the canonical CATALOG_SOURCE_* settings.

View Source
const (
	// FreshnessChannelWarnAge is the served-catalog age that warns. A source
	// maximum age above zero replaces it, unless the caller supplies an
	// explicit freshness policy.
	FreshnessChannelWarnAge = 6 * time.Hour

	// FreshnessChannelCriticalAge is the served-catalog age that is critical.
	// A source maximum age above zero replaces it with the scaled age, unless
	// the caller supplies an explicit freshness policy.
	FreshnessChannelCriticalAge = 10 * time.Hour

	// FreshnessSourceCheckWarnAge is the source-check age that warns.
	FreshnessSourceCheckWarnAge = 90 * time.Minute

	// FreshnessSourceCheckCriticalAge is the source-check age that is critical.
	FreshnessSourceCheckCriticalAge = 2 * time.Hour

	// FreshnessAcquisitionWarnAge is the acquisition-success age that warns.
	FreshnessAcquisitionWarnAge = 5 * time.Hour

	// FreshnessAcquisitionCriticalAge is the acquisition-success age that is
	// critical.
	FreshnessAcquisitionCriticalAge = 8 * time.Hour
)

Freshness thresholds. They follow the four-hour publication cadence, the one-hour channel poll, and the six-hour end-to-end objective.

View Source
const (
	// FallbackNone means an upstream generation is active.
	FallbackNone = ""

	// FallbackAwaitingSource means no upstream reply arrived yet.
	FallbackAwaitingSource = "awaiting_source"

	// FallbackSourceUnavailable means every source read failed so far.
	FallbackSourceUnavailable = "source_unavailable"
)

Fallback reasons. They say why the runtime still serves the verified embedded catalog instead of an upstream generation.

View Source
const (
	// SourcePublic reads the attested public GitHub catalog channel.
	SourcePublic = status.SourcePublic

	// SourceGitHub reads an attested channel from a named repository.
	SourceGitHub = status.SourceGitHub

	// SourceStarmap reads from another Starmap runtime.
	SourceStarmap = status.SourceStarmap

	// SourceFile reads one immutable generation from a local path.
	SourceFile = status.SourceFile

	// SourceEmbedded pins the runtime to the verified embedded bootstrap.
	SourceEmbedded = status.SourceEmbedded
)

Source kinds. Selection is terminal, so a deployment that names a custom source never falls back to the public GitHub channel.

View Source
const (
	// FreshnessUnknown means no observation supports an evaluation yet.
	FreshnessUnknown = status.FreshnessUnknown

	// FreshnessCurrent means the age is inside every threshold.
	FreshnessCurrent = status.FreshnessCurrent

	// FreshnessWarn means the age passed the warning threshold.
	FreshnessWarn = status.FreshnessWarn

	// FreshnessCritical means the age passed the critical threshold.
	FreshnessCritical = status.FreshnessCritical
)

Freshness grades of one observed timestamp.

View Source
const (
	// HealthUnknown means the component has not reported yet.
	HealthUnknown = status.HealthUnknown

	// HealthOK means the component reached its last objective.
	HealthOK = status.HealthOK

	// HealthDegraded means the component works with reduced evidence.
	HealthDegraded = status.HealthDegraded

	// HealthUnavailable means the component cannot reach its dependency.
	HealthUnavailable = status.HealthUnavailable
)

Health states of one runtime component.

View Source
const (
	// DefaultAcquisitionInterval is the provider acquisition period.
	DefaultAcquisitionInterval = 4 * time.Hour
)

Acquisition policy defaults. Acquisition has exactly two settings: whether it runs, and how often. No start-time or mode setting exists.

Variables

This section is empty.

Functions

This section is empty.

Types

type Acquirer

type Acquirer interface {
	AcquireProviders(ctx context.Context, request AcquisitionRequest) (AcquisitionResult, error)
}

Acquirer collects provider observations for the runtime. The root package selects no concrete provider client, so the deployment injects this role. Package acquisition supplies the built-in composition.

type AcquisitionPolicy

type AcquisitionPolicy struct {
	// Enabled reports whether scheduled provider acquisition runs.
	Enabled bool

	// Interval is the acquisition period. The scheduler places each instance
	// at a stable phase inside the interval. Zero means one startup pass and
	// no periodic work.
	Interval time.Duration
}

AcquisitionPolicy configures scheduled provider acquisition. The policy is exactly one switch and one period.

func DefaultAcquisitionPolicy

func DefaultAcquisitionPolicy() AcquisitionPolicy

DefaultAcquisitionPolicy returns the canonical acquisition policy.

func (AcquisitionPolicy) Validate

func (p AcquisitionPolicy) Validate() error

Validate checks the acquisition period. Zero is valid and selects one startup pass, so an operator schedules a single run without a cadence.

type AcquisitionReport

type AcquisitionReport struct {
	// RunID is the identity of the run that produced this report.
	RunID string

	// StartedAt and CompletedAt bound the run.
	StartedAt   time.Time
	CompletedAt time.Time

	// Eligible is the number of providers the run considered.
	Eligible int

	// Succeeded, Skipped, and Failed count the terminal attempts.
	Succeeded int
	Skipped   int
	Failed    int

	// Attempts holds one terminal attempt per eligible provider.
	Attempts []sources.ProviderAttempt

	// Published reports whether the runtime published a new effective catalog.
	Published bool

	// GenerationID identifies the published effective catalog.
	GenerationID string

	// Retained names the providers that kept their previous last-known-good
	// observation because this run did not replace it.
	Retained []catalogs.ProviderID

	// Health grades the run. A failed provider degrades the run.
	Health Health
}

AcquisitionReport says what one provider acquisition run produced. A partial failure still publishes: the report names the providers that kept their own last-known-good observation.

type AcquisitionRequest

type AcquisitionRequest struct {
	// RunID is the run identity that logs and status report.
	RunID string

	// Current is the immutable catalog the run starts from.
	Current *catalogs.Catalog

	// Providers restricts the run. An empty list observes every eligible
	// provider.
	Providers []catalogs.ProviderID

	// CoalesceWindow bounds how long completed observations wait for a slower
	// sibling before they publish.
	CoalesceWindow time.Duration

	// Publish emits the layers that completed inside one coalescing window.
	// The runtime retains them, rebuilds the effective catalog, and publishes
	// one generation under the lease epoch of the run. An acquirer that emits
	// nothing early leaves the field unused, and the runtime then publishes
	// every layer once the run returns.
	Publish func(context.Context, []ProviderLayer) error
}

AcquisitionRequest describes one provider acquisition run.

type AcquisitionResult

type AcquisitionResult struct {
	// Eligible is the number of providers the run considered.
	Eligible int

	// Attempts holds one terminal attempt per eligible provider.
	Attempts []sources.ProviderAttempt

	// Layers holds one observation per provider that answered.
	Layers []ProviderLayer
}

AcquisitionResult is what one acquisition run observed.

type Freshness

type Freshness = status.Freshness

Freshness is the evaluated age of one observed timestamp.

type FreshnessPolicy

type FreshnessPolicy struct {
	ChannelWarnAge     time.Duration
	ChannelCriticalAge time.Duration

	SourceCheckWarnAge     time.Duration
	SourceCheckCriticalAge time.Duration

	AcquisitionWarnAge     time.Duration
	AcquisitionCriticalAge time.Duration
}

FreshnessPolicy holds the age thresholds that turn observed timestamps into a freshness level.

func DefaultFreshnessPolicy

func DefaultFreshnessPolicy() FreshnessPolicy

DefaultFreshnessPolicy returns the canonical freshness thresholds.

func (FreshnessPolicy) Validate

func (p FreshnessPolicy) Validate() error

Validate checks that every warning threshold precedes its critical partner.

type Health

type Health = status.Health

Health is the operator-facing state of one runtime component.

type Lease

type Lease struct {
	// Holder names the instance that owns the lease.
	Holder string

	// Epoch increases on every fresh acquisition.
	Epoch uint64

	// ExpiresAt is when the lease lapses without a renewal.
	ExpiresAt time.Time
}

Lease is the exclusive right to commit a durable catalog generation. The epoch increases on every fresh acquisition, so a commit that carries an older epoch is stale.

type LeaseStore

type LeaseStore interface {
	// AcquireLease takes the lease for the named holder. A store that another
	// holder owns returns an *errors.ConflictError. That refusal names a
	// non-owner state, not a failure. The runtime keeps serving its retained
	// catalog and tries again at the next run. Every other error fails Open.
	AcquireLease(ctx context.Context, holder string, ttl time.Duration) (Lease, error)

	// Renew extends a held lease. It fails when another holder took the lease.
	Renew(ctx context.Context, lease Lease, ttl time.Duration) (Lease, error)

	// Release returns the lease early.
	Release(ctx context.Context, lease Lease) error
}

LeaseStore is the shared-storage lease that fences durable commits. A deployment whose instances share no storage needs no lease store, and the runtime then commits without a fence.

type Option

type Option func(*options) error

Option configures the connected runtime. The offline constructors in the root package take their own option type, so no offline constructor accepts a connected-runtime setting.

func WithAcquirer

func WithAcquirer(acquirer Acquirer) Option

WithAcquirer injects the provider acquisition composition. The root package selects no concrete provider client, so a runtime without an acquirer runs source refresh only.

func WithAcquisitionEnabled

func WithAcquisitionEnabled(enabled bool) Option

WithAcquisitionEnabled turns scheduled provider acquisition on or off.

func WithAcquisitionInterval

func WithAcquisitionInterval(interval time.Duration) Option

WithAcquisitionInterval sets the provider acquisition period. Zero selects one startup pass and no periodic work.

func WithCatalogSource

func WithCatalogSource(name string) Option

WithCatalogSource selects the upstream catalog source by name. It accepts public, github, starmap, file, and embedded. A named custom source is terminal: the runtime never falls back to the public channel.

func WithClientOptions

func WithClientOptions(opts ...starmap.Option) Option

WithClientOptions forwards offline client options to the Starmap client that the runtime publishes into. The root package owns the catalog store, the workspace path, and the embedded bootstrap budgets. One composition therefore supplies both kinds of setting in one list.

func WithClock

func WithClock(now func() time.Time) Option

WithClock injects the runtime clock. Tests use it to keep timing exact.

func WithCoalesceWindow

func WithCoalesceWindow(window time.Duration) Option

WithCoalesceWindow bounds how long completed provider observations wait for a slower sibling before they publish.

func WithFreshnessPolicy

func WithFreshnessPolicy(policy FreshnessPolicy) Option

WithFreshnessPolicy replaces the freshness thresholds. An explicit policy wins, so WithSourceMaxAge then derives no channel threshold.

func WithLeaseStore

func WithLeaseStore(store LeaseStore) Option

WithLeaseStore injects the shared-storage lease that fences durable commits. A deployment without shared storage needs no lease.

func WithListenAddress

func WithListenAddress(address string) Option

WithListenAddress records the server listen address. It separates two instances that share a copied state directory.

func WithRandom

func WithRandom(random Random) Option

WithRandom injects the jitter source that spreads scheduled work.

func WithRefreshTimeout

func WithRefreshTimeout(timeout time.Duration) Option

WithRefreshTimeout bounds one whole refresh run. Zero, the default, adds no deadline, so a long transfer inside its own bounds is not cut short.

func WithSchedulerIdentity

func WithSchedulerIdentity(identity string) Option

WithSchedulerIdentity overrides the derived instance identity. Use it when the deployment already owns a stable instance name.

func WithSource

func WithSource(source Source) Option

WithSource injects a deployment-owned upstream source. It replaces every built-in source implementation.

func WithSourceAPIKey

func WithSourceAPIKey(key string) Option

WithSourceAPIKey supplies the source API key. The runtime keeps the key out of status, logs, and errors.

func WithSourceAliases

func WithSourceAliases(aliases ...string) Option

WithSourceAliases declares the other stable identities that name this same runtime. A served source chain that names one of them is a self reference. The runtime then refuses the read instead of serving its own catalog back to itself.

func WithSourceChannel

func WithSourceChannel(channel string) Option

WithSourceChannel names the mutable branch that selects the current catalog.

func WithSourceMaxAge

func WithSourceMaxAge(maxAge time.Duration) Option

WithSourceMaxAge sets the age at which the served catalog counts as stale. It also derives the channel freshness thresholds. The warning age becomes the maximum age, and the critical age keeps the six-to-ten ratio of the defaults. WithFreshnessPolicy wins over this derivation.

func WithSourceMaxHops

func WithSourceMaxHops(hops int) Option

WithSourceMaxHops bounds a cascade of Starmap runtimes.

func WithSourcePolicy

func WithSourcePolicy(policy SourcePolicy) Option

WithSourcePolicy replaces the whole upstream source policy.

func WithSourcePollInterval

func WithSourcePollInterval(interval time.Duration) Option

WithSourcePollInterval sets the channel check period.

func WithSourceRepository

func WithSourceRepository(repository string) Option

WithSourceRepository names the catalog repository of a GitHub channel.

func WithSourceSignerWorkflow

func WithSourceSignerWorkflow(workflow string) Option

WithSourceSignerWorkflow pins the build provenance the source accepts.

func WithSourceStartupPolicy

func WithSourceStartupPolicy(name string) Option

WithSourceStartupPolicy decides what the runtime serves before the first upstream reply.

func WithSourceToken

func WithSourceToken(token string) Option

WithSourceToken supplies the source access token. The runtime keeps the token out of status, logs, and errors.

func WithSourceURL

func WithSourceURL(url string) Option

WithSourceURL sets the deployment-owned source address used by the starmap and file sources.

func WithStartupSpread

func WithStartupSpread(spread time.Duration) Option

WithStartupSpread bounds the random delay before the first scheduled run.

func WithStateDirectory

func WithStateDirectory(directory string) Option

WithStateDirectory selects the durable directory that retains layers, the scheduler identity seed, and source discovery state.

func WithTransferIdleTimeout

func WithTransferIdleTimeout(timeout time.Duration) Option

WithTransferIdleTimeout bounds a stalled transfer.

func WithTransferMaxDuration

func WithTransferMaxDuration(duration time.Duration) Option

WithTransferMaxDuration bounds one whole transfer.

type ProviderLayer

type ProviderLayer struct {
	// ProviderID names the observed provider.
	ProviderID catalogs.ProviderID

	// Payload is the canonical encoding of the provider observation.
	Payload []byte

	// Digest is the content digest of Payload.
	Digest string

	// ObservedAt is when acquisition accepted the observation.
	ObservedAt time.Time
}

ProviderLayer is one retained per-provider observation. The runtime keeps the last-known-good layer of every provider, so one failing provider never removes its records from the effective catalog.

type Random

type Random func() float64

Random returns a uniform value in the half-open interval [0, 1). The runtime uses it to spread scheduled work across a fleet.

type RefreshReport

type RefreshReport struct {
	// RunID is the identity of the run.
	RunID string

	// Kind names the work the run did.
	Kind string

	// StartedAt and CompletedAt bound the run.
	StartedAt   time.Time
	CompletedAt time.Time

	// Source reports the upstream read.
	Source SourceRefreshReport

	// Acquisition reports the provider observations.
	Acquisition AcquisitionReport

	// Published reports whether the runtime published a new effective catalog.
	Published bool

	// GenerationID identifies the published effective catalog.
	GenerationID string
}

RefreshReport says what one whole refresh produced. A source-only run leaves the acquisition report empty, and an acquisition-only run leaves the source report empty.

type Runtime

type Runtime struct {
	// contains filtered or unexported fields
}

Runtime is a connected Starmap. It serves the embedded catalog immediately, refreshes from one selected upstream source, retains per-provider observations, and rebuilds one immutable effective catalog from those layers. Reads reach no external system.

func Open

func Open(ctx context.Context, opts ...Option) (*Runtime, error)

Open returns a connected runtime. It serves the verified embedded catalog before the first upstream reply, so Catalog and State never wait for the network. Open starts the source and acquisition schedules and returns.

func (*Runtime) Catalog

func (r *Runtime) Catalog() *catalogs.Catalog

Catalog returns the current immutable effective catalog. It reaches no external system and never blocks on the source.

func (*Runtime) Client

func (r *Runtime) Client() *starmap.Client

Client returns the immutable publication client underneath the runtime. Use it for explicit publication, hooks, and generation retrieval.

func (*Runtime) Close

func (r *Runtime) Close() error

Close stops runtime-owned work and releases the lease. It is idempotent and joins within five seconds. A run that does not stop in time leaves a typed timeout error, so an operator sees the stall rather than a silent hang.

func (*Runtime) Refresh

func (r *Runtime) Refresh(ctx context.Context) (RefreshReport, error)

Refresh reads the upstream source and then observes every eligible provider. It changes the source layer and the provider layers in one run.

func (*Runtime) RefreshSource

func (r *Runtime) RefreshSource(ctx context.Context) (SourceRefreshReport, error)

RefreshSource reads the upstream source only. It changes the source layer.

func (*Runtime) State

func (r *Runtime) State() starmap.CatalogState

State returns one atomic snapshot of the effective catalog and its generation identity. It reaches no external system.

func (*Runtime) Status

func (r *Runtime) Status() Status

Status returns the current runtime status. It reads retained state only, so it reaches no external system and never blocks on the source.

func (*Runtime) Sync

func (r *Runtime) Sync(ctx context.Context, providers ...catalogs.ProviderID) (AcquisitionReport, error)

Sync observes providers only. It changes the provider layers and returns the acquisition report. An empty provider list observes every eligible provider.

func (*Runtime) Updates

func (r *Runtime) Updates() <-chan starmap.CatalogState

Updates returns the channel that carries every published effective catalog state. The runtime buffers the channel. A reader that falls behind loses intermediate states and always observes the newest one.

type Source

type Source = source.Source

Source reads one upstream immutable catalog generation.

type SourceHop

type SourceHop = status.SourceHop

SourceHop is one sanitized entry in an upstream source chain.

type SourceIdentityAdopter

type SourceIdentityAdopter = source.IdentityAdopter

SourceIdentityAdopter is an optional Source that takes the fleet instance identity of its runtime.

type SourceKind

type SourceKind = status.SourceKind

SourceKind names one supported upstream catalog source.

func ParseSourceKind

func ParseSourceKind(name string) (SourceKind, error)

ParseSourceKind converts one configured name into a source kind. It rejects every unknown name with a typed validation error, so a typo never selects a silent default.

func SourceKinds

func SourceKinds() []SourceKind

SourceKinds returns a caller-owned copy of every accepted source name.

type SourcePolicy

type SourcePolicy struct {
	// Kind selects the source implementation.
	Kind SourceKind

	// URL is the deployment-owned source address. It applies to the starmap
	// and file kinds.
	URL string

	// Repository names the catalog repository for the public and github kinds.
	Repository string

	// Channel names the mutable branch that selects the current catalog.
	Channel string

	// SignerWorkflow pins the build provenance the source accepts.
	SignerWorkflow string

	// PollInterval is the channel check period.
	PollInterval time.Duration

	// StartupPolicy decides what the runtime serves before the first reply.
	StartupPolicy StartupPolicy

	// MaxAge is the age at which the active catalog counts as stale.
	MaxAge time.Duration

	// MaxHops bounds a cascade of Starmap runtimes.
	MaxHops int

	// Aliases are the other stable identities that name this same runtime,
	// such as a load-balancer name or a second deployment name. A served
	// source chain that names one of them is a self reference, and address
	// comparison alone cannot detect it.
	Aliases []string
}

SourcePolicy selects and bounds the upstream catalog source. It holds no token and no API key, so a policy value is safe to log and to serve.

func DefaultSourcePolicy

func DefaultSourcePolicy() SourcePolicy

DefaultSourcePolicy returns the canonical public-channel source policy.

func (SourcePolicy) SafeIdentity

func (p SourcePolicy) SafeIdentity() string

SafeIdentity returns the source identity that status and logs may show. It names the kind and, for a GitHub channel, the repository and the channel. It never names a custom URL, a host, or a credential.

func (SourcePolicy) Validate

func (p SourcePolicy) Validate() error

Validate checks the policy fields that the runtime depends on.

type SourceRead

type SourceRead = source.Read

SourceRead is one upstream observation.

type SourceRefreshReport

type SourceRefreshReport struct {
	// RunID is the identity of the run that produced this report.
	RunID string

	// StartedAt and CompletedAt bound the run.
	StartedAt   time.Time
	CompletedAt time.Time

	// SourceIdentity is the safe identity of the source that answered.
	SourceIdentity string

	// Changed reports whether the upstream generation moved.
	Changed bool

	// Published reports whether the runtime published a new effective catalog.
	Published bool

	// GenerationID identifies the upstream generation the runtime retained.
	GenerationID string

	// PublishedAt is the upstream publication time.
	PublishedAt time.Time

	// Health is what this runtime observed while it read the source. It grades
	// the transfer only.
	Health Health

	// UpstreamHealth is the health the upstream reported about itself. It stays
	// independent of Health, so a healthy transfer still carries a degraded
	// upstream report.
	UpstreamHealth Health

	// Reason is the safe reason code of a failed read.
	Reason string

	// Chain is the sanitized upstream source chain.
	Chain []SourceHop
}

SourceRefreshReport says what one upstream source read produced.

type SourceWatcher

type SourceWatcher = source.Watcher

SourceWatcher is an optional Source that reports each upstream change.

type StartupPolicy

type StartupPolicy string

StartupPolicy decides what the runtime serves while the first source read is still outstanding.

const (
	// StartupPreferSource keeps the embedded baseline active and replaces it
	// with the first verified upstream generation. It is the default.
	StartupPreferSource StartupPolicy = "prefer_source"

	// StartupRequireSource keeps the runtime unusable until one verified
	// upstream generation is active. Open reads the source one time and fails
	// when that read fails. The policy names the evidence the runtime needs,
	// not the lease. A replica that another instance owns therefore opens
	// without a read and consumes the state that the owner publishes.
	StartupRequireSource StartupPolicy = "require_source"

	// StartupPreferLocal keeps the retained local generation active and
	// applies an upstream generation only on an explicit refresh.
	StartupPreferLocal StartupPolicy = "prefer_local"
)

func ParseStartupPolicy

func ParseStartupPolicy(name string) (StartupPolicy, error)

ParseStartupPolicy converts one configured name into a startup policy.

func (StartupPolicy) String

func (p StartupPolicy) String() string

String returns the wire value of the startup policy.

func (StartupPolicy) Valid

func (p StartupPolicy) Valid() bool

Valid reports whether the policy is one of the accepted names.

type Status

type Status = status.Status

Status is the operator-facing state of one connected runtime.

Directories

Path Synopsis
Package source owns the upstream source contract of a connected catalog runtime.
Package source owns the upstream source contract of a connected catalog runtime.
Package status owns the observable vocabulary of a connected catalog runtime.
Package status owns the observable vocabulary of a connected catalog runtime.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL