runner

package
v0.6.1 Latest Latest
Warning

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

Go to latest
Published: Jun 5, 2026 License: AGPL-3.0, AGPL-3.0-only Imports: 11 Imported by: 0

Documentation

Overview

Package runner implements execution substrate introspection.

Three-layer model (mandatory):

  • Layer 1 — SubstrateFacts: unconditional raw measurements (no mode params, no policy)
  • Layer 2 — []Finding: policy evaluation (same facts, different severity per mode)
  • Layer 3 — HealthGrade: deterministic reducer from findings

This package has no knowledge of CI runners, pipeline phases, or output rendering. It returns structured data; callers own rendering and policy wiring.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func EvaluateHealth

func EvaluateHealth(facts SubstrateFacts, opts Options) ([]Finding, HealthGrade)

EvaluateHealth applies policy to SubstrateFacts and returns findings + grade. Options controls Layer 2 only — CollectFacts is unconditional and unaffected.

func ResolveInvocationID

func ResolveInvocationID(engine ExecutionEngine, identity RunnerIdentity) string

ResolveInvocationID returns a universal correlation ID for this run. For CI engines, this is the pipeline/run ID. For local runs, a generated 12-char hex ID.

Types

type ExecutionEngine

type ExecutionEngine string

ExecutionEngine identifies the CI orchestrator or execution context.

const (
	EngineGitLab       ExecutionEngine = "gitlab"
	EngineGitHub       ExecutionEngine = "github"
	EngineForgejo      ExecutionEngine = "forgejo"
	EngineGitea        ExecutionEngine = "gitea"
	EngineLocal        ExecutionEngine = "local"
	EngineStageFreight ExecutionEngine = "stagefreight"
	EngineUnknown      ExecutionEngine = "unknown"
)

func DetectEngine

func DetectEngine() ExecutionEngine

DetectEngine identifies the CI orchestrator from environment variables.

type ExecutionReport

type ExecutionReport struct {
	Engine       ExecutionEngine `json:"engine"`
	InvocationID string          `json:"invocation_id"` // universal correlation key
	Identity     RunnerIdentity  `json:"identity"`
	Facts        SubstrateFacts  `json:"facts"`
	Findings     []Finding       `json:"findings"`
	Health       HealthGrade     `json:"health"`
}

ExecutionReport is the complete execution introspection result. JSON field names use "runner" prefix in cistate for compatibility.

func Run

func Run(rootDir string, opts Options) ExecutionReport

Run collects substrate facts, evaluates health policy, and assembles an ExecutionReport. This is the primary entry point.

type Finding

type Finding struct {
	ID       string `json:"id"`
	Status   string `json:"status"` // "ok" | "warn" | "fail"
	Detail   string `json:"detail,omitempty"`
	Severity string `json:"severity"` // "hard_fail" | "warn" | "info"
}

Finding is Layer 2: policy applied to facts.

type HealthGrade

type HealthGrade string

HealthGrade is Layer 3: derived from findings.

const (
	Healthy   HealthGrade = "healthy"
	Degraded  HealthGrade = "degraded"
	Unhealthy HealthGrade = "unhealthy"
)

type Options

type Options struct {
	DockerRequired bool  // true = docker absence is hard_fail; false = info
	IsCrucible     bool  // doubles disk/memory warn thresholds
	DiskWarnMB     int64 // 0 = default (2048)
	DiskFailMB     int64 // 0 = default (512)
	MemWarnMB      int64 // 0 = default (512); IsCrucible doubles to 1024
}

Options controls Layer 2 policy only — never Layer 1 fact collection.

type RunnerIdentity

type RunnerIdentity struct {
	Name       string `json:"name,omitempty"`        // CI_RUNNER_DESCRIPTION / RUNNER_NAME
	PipelineID string `json:"pipeline_id,omitempty"` // CI_PIPELINE_ID / GITHUB_RUN_ID
	JobID      string `json:"job_id,omitempty"`      // CI_JOB_ID / GITHUB_JOB
	Workflow   string `json:"workflow,omitempty"`    // GITHUB_WORKFLOW (GitHub only)
	Controller string `json:"controller,omitempty"`  // future: SF daemon controller
	Satellite  string `json:"satellite,omitempty"`   // future: SF satellite node
}

RunnerIdentity holds engine-specific session fields. TODO: rename to ExecutionIdentity in a follow-on PR for domain consistency.

func ExtractIdentity

func ExtractIdentity(engine ExecutionEngine) RunnerIdentity

ExtractIdentity reads engine-specific session fields from environment variables.

type SubstrateFacts

type SubstrateFacts struct {
	DockerSocket         string  `json:"docker_socket"` // path if found, "" if absent
	DockerAvailable      bool    `json:"docker_available"`
	DindDetected         bool    `json:"dind_detected"`
	BuildKitAvailable    bool    `json:"buildkit_available"` // = DockerAvailable (modern Docker ships BuildKit)
	BuildxAvailable      bool    `json:"buildx_available"`
	DiskFreeMB           int64   `json:"disk_free_mb"` // .stagefreight filesystem
	TmpFreeMB            int64   `json:"tmp_free_mb"`
	MemAvailableMB       int64   `json:"mem_available_mb"` // -1 if unsupported (non-Linux)
	CPULoadAvg1          float64 `json:"cpu_load_avg1"`    // -1 if unsupported
	StagefreightWritable bool    `json:"stagefreight_writable"`
	WorkdirReadable      bool    `json:"workdir_readable"`
	InodePctFree         int     `json:"inode_pct_free"` // -1 if unsupported
}

SubstrateFacts is Layer 1: raw substrate measurements, always collected unconditionally. Named "Substrate" not "Runner" because these facts describe the execution substrate regardless of whether it is a CI runner, local machine, or SF daemon node. No mode parameters. No policy. No severity. Just facts.

func CollectFacts

func CollectFacts(rootDir string) SubstrateFacts

CollectFacts gathers raw substrate measurements unconditionally. No mode parameters. No policy. No severity. Just facts.

Jump to

Keyboard shortcuts

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