Documentation
¶
Overview ¶
Package runtime defines caic-owned task execution runtime interfaces and types.
Index ¶
- Constants
- Variables
- type CacheMount
- type ConnectionInfo
- type ConnectionTarget
- type DirEntry
- type Event
- type EventFilter
- type EventKind
- type FetchOpts
- type FetchedBranch
- type Files
- type ForkOptions
- type ForkRepo
- type GitCommit
- type GitFileStat
- type GitFileStatus
- type ID
- type Instance
- type InstanceID
- type InstanceInspect
- type Inventory
- type Lifecycle
- type Metadata
- type MetadataKey
- type Monitor
- type Mount
- type Name
- type PrivilegeInfo
- type ProcessInfo
- type Repo
- type Repository
- type RepositoryOperation
- type RepositoryStatus
- type Router
- func (r *Router) CompactRepositoryStatus(ctx context.Context, id ID, repoIdx int) (status RepositoryStatus, err error)
- func (r *Router) Connect(ctx context.Context, id ID, opts *StartOptions) (conn ConnectionInfo, err error)
- func (r *Router) Diff(ctx context.Context, id ID, repoIdx int, args ...string) (out string, err error)
- func (r *Router) DiskUsage(ctx context.Context, ids []ID) (usage map[ID]int64, err error)
- func (r *Router) Fetch(ctx context.Context, id ID, opts FetchOpts) (branches []FetchedBranch, err error)
- func (r *Router) FileDiff(ctx context.Context, id ID, repoIdx int, commit, path, originalPath string) (out string, err error)
- func (r *Router) FileSize(ctx context.Context, id ID, path string) (int64, error)
- func (r *Router) Fork(ctx context.Context, id ID, opts *ForkOptions) (forkID ID, conn ConnectionInfo, err error)
- func (r *Router) Inspect(ctx context.Context, id ID) (info *InstanceInspect, err error)
- func (r *Router) Launch(ctx context.Context, repos []Repo, opts *StartOptions) (id ID, err error)
- func (r *Router) List(ctx context.Context) (out []Instance, err error)
- func (r *Router) Metadata(ctx context.Context, id ID, key MetadataKey) (value string, err error)
- func (r *Router) Processes(ctx context.Context, id ID) (procs []ProcessInfo, err error)
- func (r *Router) Purge(ctx context.Context, id ID) (err error)
- func (r *Router) ReadDir(ctx context.Context, id ID, path string) ([]DirEntry, bool, error)
- func (r *Router) ReadFile(ctx context.Context, id ID, path string, offset, length int64) iter.Seq2[[]byte, error]
- func (r *Router) RefreshRefs(ctx context.Context, id ID) (err error)
- func (r *Router) RepositoryStatus(ctx context.Context, id ID, repoIdx int) (status RepositoryStatus, err error)
- func (r *Router) Revive(ctx context.Context, id ID) (err error)
- func (r *Router) Signal(ctx context.Context, id ID, pid int, sig string) (err error)
- func (r *Router) Stop(ctx context.Context, id ID) (err error)
- func (r *Router) SudoPassword(ctx context.Context, id ID) (password string, err error)
- func (r *Router) TurnSnapshot(ctx context.Context, id ID, previous []FetchedBranch) (out []TurnRepository, err error)
- func (r *Router) VNCPort(ctx context.Context, id ID) int
- func (r *Router) WatchEvents(ctx context.Context, filter EventFilter) (iter.Seq2[Event, error], error)
- func (r *Router) WatchStats(ctx context.Context, ids []ID) (iter.Seq2[StatsSample, error], error)
- type StartOptions
- type Stats
- type StatsSample
- type System
- type TurnRepository
Constants ¶
const DirEntryLimit = 16000
DirEntryLimit bounds each directory listing.
const FileChunkSize = 64 << 10
FileChunkSize bounds each runtime file chunk to 64 KiB.
Variables ¶
var ErrIsDir = errors.New("path is a directory")
ErrIsDir reports that a path names a directory where a regular file was required.
Functions ¶
This section is empty.
Types ¶
type CacheMount ¶
type CacheMount struct {
Name string `json:"name"`
Description string `json:"description"`
HostPath string `json:"host_path"`
ContainerPath string `json:"container_path"` // Resolved target path in the runtime container.
ReadOnly bool `json:"read_only"`
Shallow bool `json:"shallow"`
}
CacheMount describes a host cache directory made available to a runtime.
Is serialized as task metadata to disk. Is not used for HTTP wire protocol.
type ConnectionInfo ¶
type ConnectionInfo struct {
AgentTarget ConnectionTarget
TailscaleFQDN string
TailscaleAuthURL string
}
ConnectionInfo describes connection details returned by a runtime instance.
type ConnectionTarget ¶ added in v0.10.1
type ConnectionTarget struct {
SSHHost string
}
ConnectionTarget describes how agent relay operations reach a runtime.
It is currently SSH-shaped because mdruntime is the only production adapter. Non-SSH adapters should replace direct agent SSH/file-copy operations with a runtime-owned execution and transfer contract instead of leaking adapter details into task orchestration.
type DirEntry ¶ added in v0.15.0
type DirEntry struct {
Name string
IsDir bool
// Size is the reported size in bytes; a directory reports its own metadata.
Size int64
// Modified is the modification time, or nil when the runtime cannot report it.
Modified *time.Time
}
DirEntry is one immediate child of a runtime directory.
type EventFilter ¶
type EventFilter struct {
MetadataKey MetadataKey
}
EventFilter selects runtime lifecycle events.
type EventKind ¶ added in v0.11.5
type EventKind string
EventKind identifies a runtime lifecycle event.
const ( // EventDestroy reports that an instance was removed and cannot be revived. EventDestroy EventKind = "destroy" // EventDie reports that an instance stopped. EventDie EventKind = "die" // EventOOM reports that the runtime killed an instance for exceeding memory. EventOOM EventKind = "oom" // EventRestart reports that a previously stopped instance restarted. EventRestart EventKind = "restart" // EventStart reports that a previously stopped instance started. EventStart EventKind = "start" )
type FetchOpts ¶ added in v0.12.0
type FetchOpts struct {
// Commit commits the instance's pending changes before fetching, so the
// host receives them as well.
Commit bool
}
FetchOpts configures Repository.Fetch. Its zero value fetches only what the instance already committed, which leaves its history and working tree untouched.
type FetchedBranch ¶ added in v0.12.0
type FetchedBranch struct {
// RepositoryPath is the repository's absolute path inside the runtime.
RepositoryPath string
// BranchName is the short local branch name, such as "main" or "caic-1".
BranchName string
// CommitHash is the full Git object ID of the fetched branch tip.
CommitHash string
}
FetchedBranch identifies an exact repository branch tip observed by Fetch.
type Files ¶ added in v0.14.0
type Files interface {
// ReadFile yields chunks of at most FileChunkSize bytes, borrowed until
// the next iteration. Empty files yield one empty chunk. Missing files
// yield fs.ErrNotExist. Offset is a byte offset; length -1 reads to EOF.
// Stopping iteration releases the reader and process.
ReadFile(ctx context.Context, id ID, path string, offset, length int64) iter.Seq2[[]byte, error]
// FileSize returns the current regular-file size; it is not a version validator.
FileSize(ctx context.Context, id ID, path string) (int64, error)
// ReadDir returns immediate children of path sorted by name, capped at
// DirEntryLimit. truncated reports that children were dropped. Missing
// paths yield fs.ErrNotExist, non-directories ErrIsDir.
ReadDir(ctx context.Context, id ID, path string) (entries []DirEntry, truncated bool, err error)
}
Files streams regular files from an instance, never the server's filesystem.
type ForkOptions ¶
type ForkOptions struct {
RuntimeName Name
Metadata Metadata
// Repos is the full set of repositories the fork should contain: every repo
// already in the source instance plus any new ones to add. Each names its
// destination primary branch; the caller owns branch uniqueness.
Repos []ForkRepo
Display bool // Inherit or enable X11/VNC.
Tailscale bool // Inherit or enable Tailscale.
USB bool // Inherit or enable USB.
Sudo bool // Inherit or enable root access (password-based sudo).
Harness harness.Name
ExtraEnv []string // KEY=VALUE pairs for ~/.env.
Mounts []Mount // Host directories bind-mounted into the fork.
MaxCPUs int // Max CPU cores; 0 means use the default.
LogWriter io.Writer // Provisioning log output.
}
ForkOptions holds parameters for forking a runtime instance.
type ForkRepo ¶ added in v0.11.2
type ForkRepo struct {
// GitRoot is the absolute host git repository path (the runtime's GitRoot).
GitRoot string
// ContainerPath is the container path to mount a new repo at. Used only for repos
// not already in the source instance; existing repos keep their mount.
ContainerPath string
// SourceBranches are the branches to carry, primary first. For a repo already
// in the source instance these are its current branches; for a new repo they
// are the host branches to push (empty defaults to the repo's upstream).
SourceBranches []string
// DestPrimary is the fork's primary branch. The caller owns its uniqueness;
// the runtime uses it verbatim.
DestPrimary string
}
ForkRepo describes one repository in a fork: its identity, the branches it carries, and the fork's destination primary branch.
type GitCommit ¶ added in v0.12.0
type GitCommit struct {
SHA string
Subject string
Decorations string
AuthoredDate string
Behind bool // Present only on the comparison branch, not in HEAD's history.
Stat []GitFileStat
}
GitCommit describes one commit unique to either side of the comparison branch.
type GitFileStat ¶ added in v0.12.0
type GitFileStat struct {
Path string
LinesAdded int
LinesDeleted int
Binary bool
OldSize int64 // Byte size of the binary pre-image; zero for added paths.
NewSize int64 // Byte size of the binary post-image; zero for deleted paths.
}
GitFileStat describes one path's changes in a commit.
type GitFileStatus ¶ added in v0.12.0
type GitFileStatus struct {
Path string
OriginalPath string
IndexStatus string
WorktreeStatus string
LinesAdded int
LinesDeleted int
Binary bool
OldSize int64 // Byte size of the binary pre-image; zero for added paths.
NewSize int64 // Byte size of the binary post-image; zero for deleted paths.
}
GitFileStatus describes one uncommitted path from git status porcelain v2.
type ID ¶ added in v0.11.0
type ID string
ID identifies a runtime instance across runtime backends.
It combines a runtime Name with a backend-local instance ID, encoded as "name:instance". Runtime systems receive and return the qualified form so different runtimes can own colliding backend-local instance IDs.
func NewID ¶ added in v0.11.0
func NewID(runtimeName Name, instanceID InstanceID) ID
NewID returns a qualified ID from a runtime name and backend-local instance ID.
func (ID) InstanceID ¶ added in v0.11.0
func (id ID) InstanceID() InstanceID
InstanceID returns the backend-local instance ID part of the qualified ID.
func (ID) RuntimeName ¶ added in v0.11.0
RuntimeName returns the runtime name part of the qualified ID.
An empty return means the ID is unqualified and invalid outside a concrete runtime backend implementation.
type Instance ¶
type Instance struct {
ID ID
AgentTarget ConnectionTarget
State string
Repos []Repo
Tailscale bool
TailscaleFQDN string
USB bool
Display bool
Sudo bool
VNCPort int
}
Instance describes a known runtime instance.
type InstanceID ¶
type InstanceID string
InstanceID identifies a backend-local runtime allocation.
It is used only inside concrete runtime adapters when calling their backing runtime APIs. Application-facing runtime interfaces use qualified ID values.
type InstanceInspect ¶ added in v0.10.2
type InstanceInspect struct {
Runtime string
ID ID
State string
ImageRef string
ImageID string
OS string
CPUArchitecture string
CPULimit float64
Mounts []Mount
Caches []CacheMount
}
InstanceInspect describes observed runtime configuration for an instance.
type Inventory ¶
type Inventory interface {
List(ctx context.Context) ([]Instance, error)
Metadata(ctx context.Context, id ID, key MetadataKey) (string, error)
Inspect(ctx context.Context, id ID) (*InstanceInspect, error)
}
Inventory lists runtime instances and their observed metadata.
type Lifecycle ¶ added in v0.11.0
type Lifecycle interface {
// Launch starts the runtime instance and writes connection config. It does
// not wait for transport readiness. Repos must have branches set.
Launch(ctx context.Context, repos []Repo, opts *StartOptions) (ID, error)
// Connect waits for transport readiness and completes provisioning for the
// runtime instance identified by id. It returns optional connection details.
Connect(ctx context.Context, id ID, opts *StartOptions) (ConnectionInfo, error)
// Stop gracefully stops the runtime instance without removing it. The
// instance can be restarted later with Revive.
Stop(ctx context.Context, id ID) error
// Purge stops and removes the runtime instance identified by id.
Purge(ctx context.Context, id ID) error
// Revive restarts a stopped runtime instance and waits for connectivity.
// The instance's filesystem is preserved.
Revive(ctx context.Context, id ID) error
// Fork snapshots a running or stopped instance and creates a new one where
// each mapped repo is checked out on a new branch. opts.Repos names the full
// repo set and each repo's destination primary branch.
Fork(ctx context.Context, id ID, opts *ForkOptions) (ID, ConnectionInfo, error)
// VNCPort returns the host port mapped to the runtime instance's VNC port.
// Returns 0 when the instance has no display.
VNCPort(ctx context.Context, id ID) int
// Processes returns the list of running processes inside the runtime instance.
Processes(ctx context.Context, id ID) ([]ProcessInfo, error)
// Signal sends a signal to a process inside the runtime instance.
Signal(ctx context.Context, id ID, pid int, sig string) error
}
Lifecycle manages runtime instance lifecycle operations.
type Metadata ¶
type Metadata map[MetadataKey]string
Metadata stores runtime-neutral metadata for an instance.
Runtime adapters choose the backing store. mdruntime uses container labels; other adapters can use disk metadata, cloud tags, or a local registry.
type MetadataKey ¶
type MetadataKey string
MetadataKey identifies a caic runtime metadata field.
const ( MetadataTaskID MetadataKey = "caic.id" MetadataLegacyTaskID MetadataKey = "caic" MetadataHarness MetadataKey = "caic.harness" MetadataLegacyHarness MetadataKey = "harness" MetadataGitHubToken MetadataKey = "caic.githubToken" //nolint:gosec // Metadata key for a boolean flag, not a credential. MetadataModelRefresh MetadataKey = "caic.modelRefresh" MetadataDisplayCapability MetadataKey = "md.display" MetadataSmokeRun MetadataKey = "caic.smoke_run" )
Runtime metadata keys used to recognize and restore caic-managed instances.
type Monitor ¶
type Monitor interface {
// DiskUsage returns writable-layer sizes for the requested instances in one
// batch. Missing entries have no available measurement.
DiskUsage(ctx context.Context, ids []ID) (map[ID]int64, error)
WatchStats(ctx context.Context, ids []ID) (iter.Seq2[StatsSample, error], error)
WatchEvents(ctx context.Context, filter EventFilter) (iter.Seq2[Event, error], error)
}
Monitor reads resource usage and lifecycle events.
type Mount ¶ added in v0.10.0
type Mount struct {
HostPath string `json:"host_path"`
ContainerPath string `json:"container_path"` // Resolved target path in the runtime container.
ReadOnly bool `json:"read_only"`
}
Mount describes a host directory bind-mounted into a runtime.
Is serialized as task metadata to disk. Is not used for HTTP wire protocol.
type Name ¶ added in v0.11.0
type Name string
Name identifies a runtime backend, such as docker or podman.
type PrivilegeInfo ¶
PrivilegeInfo reads privileged runtime instance credentials.
type ProcessInfo ¶
type ProcessInfo struct {
// PID is the process ID.
PID int
// PPID is the parent process ID.
PPID int
// PGRP is the process group ID.
PGRP int
// User is the effective user name.
User string
// State is the process state and modifiers reported by the runtime.
State string
// Priority is the kernel scheduling priority.
Priority int
// Nice is the process niceness value.
Nice int
// Threads is the number of threads in the process.
Threads int
// OpenFDs is the number of open file descriptors, or nil when unavailable.
OpenFDs *int
// CPU is the lifetime-average CPU percentage reported by ps (100% per core).
CPU float64
// Mem is the percentage of physical memory used at the time of inspection.
Mem float64
// RSSBytes is the resident set size in bytes.
RSSBytes uint64
// CPUTime is the cumulative user and system CPU time consumed by the process.
CPUTime time.Duration
// StartedAt is when the process started.
StartedAt time.Time
// Command is the full command line reported by the runtime.
Command string
}
ProcessInfo describes a single process running inside a runtime instance.
type Repo ¶
type Repo struct {
GitRoot string
ContainerPath string
Branch string
BaseBranch string
Remote string
}
Repo describes a git repository available to a runtime instance.
type Repository ¶ added in v0.12.0
type Repository interface {
TurnSnapshot(ctx context.Context, id ID, previous []FetchedBranch) ([]TurnRepository, error)
Diff(ctx context.Context, id ID, repoIdx int, args ...string) (string, error)
Fetch(ctx context.Context, id ID, opts FetchOpts) ([]FetchedBranch, error)
// RefreshRefs copies cached upstream refs into the instance without moving
// working branches or committing pending edits.
RefreshRefs(ctx context.Context, id ID) error
FileDiff(ctx context.Context, id ID, repoIdx int, commit, path, originalPath string) (string, error)
RepositoryStatus(ctx context.Context, id ID, repoIdx int) (RepositoryStatus, error)
// CompactRepositoryStatus returns the branch, divergence, working-tree
// counts, operation, and branch-diff numstat of one repository without the
// per-commit log, cheap enough for periodic activity-driven probes.
CompactRepositoryStatus(ctx context.Context, id ID, repoIdx int) (RepositoryStatus, error)
}
Repository provides repository operations inside runtime instances.
type RepositoryOperation ¶ added in v0.12.0
type RepositoryOperation string
RepositoryOperation identifies an in-progress Git operation in a repository.
const ( RepositoryOperationRebase RepositoryOperation = "rebase" RepositoryOperationMerge RepositoryOperation = "merge" RepositoryOperationCherryPick RepositoryOperation = "cherry-pick" RepositoryOperationRevert RepositoryOperation = "revert" RepositoryOperationBisect RepositoryOperation = "bisect" )
RepositoryOperation values identify supported in-progress Git operations.
type RepositoryStatus ¶ added in v0.12.0
type RepositoryStatus struct {
Branch string
Upstream string
Operation RepositoryOperation
Ahead int
Behind int
DiffStat []GitFileStat
Commits []GitCommit
Uncommitted []GitFileStatus
}
RepositoryStatus describes the checked-out branch and its changes relative to the host checkout's original tracking branch.
type Router ¶ added in v0.11.0
type Router struct {
Runtimes []System
ByName map[Name]System
// contains filtered or unexported fields
}
Router dispatches runtime operations to one of several runtime backends.
func NewRouter ¶ added in v0.11.0
NewRouter creates a runtime router. A recorder is required; pass metrics.Nop{} to discard observations.
A router reports unavailable backends to its caller rather than logging them, so it holds no logger of its own.
func (*Router) CompactRepositoryStatus ¶ added in v0.13.0
func (r *Router) CompactRepositoryStatus(ctx context.Context, id ID, repoIdx int) (status RepositoryStatus, err error)
CompactRepositoryStatus returns the log-free repository status from the owning backend.
func (*Router) Connect ¶ added in v0.11.0
func (r *Router) Connect(ctx context.Context, id ID, opts *StartOptions) (conn ConnectionInfo, err error)
Connect waits for transport readiness on the selected backend.
func (*Router) Diff ¶ added in v0.11.0
func (r *Router) Diff(ctx context.Context, id ID, repoIdx int, args ...string) (out string, err error)
Diff returns a diff from the owning backend.
func (*Router) DiskUsage ¶ added in v0.12.0
DiskUsage returns writable-layer sizes across the requested runtime instances. Each owning runtime receives one batched request.
func (*Router) Fetch ¶ added in v0.11.0
func (r *Router) Fetch(ctx context.Context, id ID, opts FetchOpts) (branches []FetchedBranch, err error)
Fetch fetches task repository changes from the owning backend and returns the exact branch tips observed.
func (*Router) FileDiff ¶ added in v0.12.0
func (r *Router) FileDiff(ctx context.Context, id ID, repoIdx int, commit, path, originalPath string) (out string, err error)
FileDiff returns one committed or uncommitted file patch from the owning backend.
func (*Router) FileSize ¶ added in v0.14.0
FileSize returns the current regular-file size from the owning runtime.
func (*Router) Fork ¶ added in v0.11.0
func (r *Router) Fork(ctx context.Context, id ID, opts *ForkOptions) (forkID ID, conn ConnectionInfo, err error)
Fork snapshots an instance on its owning backend. Cross-runtime forks are rejected.
func (*Router) Inspect ¶ added in v0.11.0
Inspect returns observed runtime configuration for an instance.
func (*Router) List ¶ added in v0.11.0
List returns known runtime instances from all inventory backends.
It tolerates a backend being unavailable. Instances from the runtimes that answered come back alongside an error naming the ones that did not, so a caller that can work with a partial inventory uses it and logs the error, while a caller that needs a complete one checks err. The result is nil only when no runtime answered at all, which lets a caller tell an unreadable inventory from an empty one.
func (*Router) ReadFile ¶ added in v0.14.0
func (r *Router) ReadFile(ctx context.Context, id ID, path string, offset, length int64) iter.Seq2[[]byte, error]
ReadFile streams regular file chunks from the owning runtime.
func (*Router) RefreshRefs ¶ added in v0.14.1
RefreshRefs copies cached upstream refs into the owning runtime instance.
func (*Router) RepositoryStatus ¶ added in v0.12.0
func (r *Router) RepositoryStatus(ctx context.Context, id ID, repoIdx int) (status RepositoryStatus, err error)
RepositoryStatus returns git branch, commit, and working-tree state from the owning backend. RepositoryStatus returns the repository status from the owning backend.
func (*Router) Revive ¶ added in v0.11.0
Revive restarts a stopped runtime instance on its owning backend.
func (*Router) Stop ¶ added in v0.11.0
Stop gracefully stops a runtime instance on its owning backend.
func (*Router) SudoPassword ¶ added in v0.11.0
SudoPassword fetches a sudo password from an instance's owning backend.
func (*Router) TurnSnapshot ¶ added in v0.14.0
func (r *Router) TurnSnapshot(ctx context.Context, id ID, previous []FetchedBranch) (out []TurnRepository, err error)
TurnSnapshot fetches once and measures branch and turn changes on the owning backend.
type StartOptions ¶
type StartOptions struct {
RuntimeName Name
Metadata Metadata
BaseImage string
ContainerPlatform string
Harness harness.Name
Caches []CacheMount
Mounts []Mount
Tailscale bool
USB bool
Display bool
Sudo bool
// MaxCPUs limits the number of CPU cores the runtime instance may use.
// Zero means use the runtime adapter default.
MaxCPUs int
// GitHubToken is the resolved GitHub token to inject into the runtime
// environment. Empty means no token is injected.
GitHubToken string
// ExtraEnv contains additional KEY=VALUE pairs injected into the runtime
// environment without being represented in runtime metadata.
ExtraEnv []string
// LogWriter receives provisioning log lines from the runtime backend.
// Must not be nil.
LogWriter io.Writer
}
StartOptions holds optional flags for runtime instance startup.
type Stats ¶
type Stats struct {
Ts time.Time
CPUPerc float64 // 100% is one fully busy logical CPU.
CPUCeiling float64 // Configured upper bound in CPU units; zero when unknown. Excludes inherited limits and process affinity.
CPUQuota *float64 // Explicit quota in CPU units; zero is unrestricted, nil is unknown.
RuntimeCPUs int // Logical CPUs on the owning runtime; zero when unknown.
CPUError string // Runtime CPU metadata observation failure.
MemUsed uint64
MemLimit uint64
MemPerc float64
NetRx uint64
NetTx uint64
BlockRead uint64
BlockWrite uint64
DiskUsed int64
}
Stats is a snapshot of runtime resource usage.
type StatsSample ¶ added in v0.10.2
StatsSample is a streamed runtime resource usage snapshot for one instance.
type System ¶ added in v0.11.0
type System interface {
Name() Name
Lifecycle
Files
Repository
Monitor
Inventory
PrivilegeInfo
}
System provides all runtime capabilities used by the application.
type TurnRepository ¶ added in v0.14.0
type TurnRepository struct {
RepoIndex int
Status RepositoryStatus
Branches []FetchedBranch
TurnDiff []GitFileStat
StatusErr error
}
TurnRepository contains one fetched repository's branch summary and committed turn delta. StatusErr leaves the previous live summary in place; fetched branches remain usable. A nil TurnDiff means the previous tip was absent or could not be compared.
Directories
¶
| Path | Synopsis |
|---|---|
|
Package runtimetest provides shared test doubles for the runtime package's interfaces, reusable by any package that depends on a runtime seam.
|
Package runtimetest provides shared test doubles for the runtime package's interfaces, reusable by any package that depends on a runtime seam. |