Runtime Instrumentation Architecture

Active architecture for the Stella Ops Linux and Windows host agents — local runtime status collection, optional Linux Tetragon sensor input, and digest-gated evidence publication. Audience: engineers building the host agents and the shared Agent.Core contracts, and operators deploying agents onto non-Kubernetes container hosts. This is a host-agent architecture, not a Kubernetes or Tetragon-first one.

Overview

Runtime Instrumentation connects local host runtime observations to Stella Ops release and security decisions. The active architecture is not Tetragon-first and not Kubernetes-first. It is a host-agent architecture for non-Kubernetes container estates.

The Stella Ops Linux agent and Stella Ops Windows agent are the deployable products. They collect local container runtime status, normalize local sensor observations, enforce digest-gated evidence rules, and publish evidence to Stella Ops services. Tetragon is one optional Linux eBPF sensor input that the Linux agent may bridge when it is available; it is not the Stella Ops Linux agent.

Product Boundary

Active scope:

Out of active scope:

Existing Kubernetes-related source slices are historical and must not be expanded as part of the host-agent plan.

Terminology

TermMeaning
Agent.CoreShared contracts and utilities for Stella Ops host agents. It must not contain Tetragon-specific, Linux-specific, or Windows-specific assumptions.
Stella Ops Linux agentStella Ops owned service installed on Linux container hosts. It owns local runtime status, optional sensor inputs, health, buffering, and evidence publication.
Stella Ops Windows agentStella Ops owned Windows Service installed on Windows container hosts. It owns Windows runtime status, Windows sensor inputs, health, buffering, and evidence publication.
Tetragon bridgeOptional Linux-only adapter that consumes local Tetragon output and converts it into Stella Ops runtime observations.
Runtime status sourceLocal authority used to map a running container to image identity, runtime metadata, and host context.
Digest gateThe rule that runtime evidence is not published unless it resolves to a valid immutable image digest.

Target Components

RuntimeInstrumentation/
  StellaOps.Agent.Core/                         # Shared host-agent contracts
    AgentIdentity
    AgentCapability
    HostRuntimeStatus
    RuntimeObservation
    RuntimeStatusSource
    RuntimeEvidencePublisher
    AgentHealth

  StellaOps.Agent.Linux/                        # Linux host-agent base
    generic-host daemon entry point
    Linux runtime status sources
    optional local sensor coordination boundary
    bounded local status spool
    health/status snapshot publisher contract

  StellaOps.Agent.Windows/                      # Windows host-agent base
    Windows Service-style generic-host lifecycle
    Windows runtime status sources
    optional Windows sensor coordination boundary
    bounded local status spool
    health/status snapshot publisher contract

  StellaOps.Agent.Linux.SymbolResolver/         # Linux file-backed stack-frame symbolizer
    IProcessSymbolResolver / ProcessSymbolResolver
    RuntimeObservationSymbolUpgrader
    Internal/ProcMapsParser, ElfSymbolTableReader, DwarfLineReader
    AddStellaOpsLinuxSymbolResolver registration

  StellaOps.Agent.Tetragon/                     # Optional Linux Tetragon bridge/client
    TetragonExportClient (named HttpClient "StellaOps.Agent.Tetragon")
    TetragonRuntimeObservationSource (IRuntimeObservationSource + ITetragonBridgeHealth)
    TetragonRuntimeObservationAdapter (event normalization)
    bridge into Agent.Core observation contracts

  StellaOps.RuntimeInstrumentation.Tetragon/    # Existing adapter model slice
    ContainerImageDigestResolver
    RuntimeContainerImageStatus command/Kubernetes API/Kubernetes watch sources
    canonical runtime container-image status snapshots

  StellaOps.RuntimeInstrumentation.Worker/      # Existing local status worker slice
    RuntimeInstrumentationWorkerHost
    local file/command status refresh
    digest resolver wiring

The target components are incremental. Current code already contains the shared StellaOps.Agent.Core contract boundary, Linux and Windows host-agent bases (including the digest gate, bounded spool, and evidence-envelope publication path), the file-backed Linux symbol resolver, the optional Tetragon bridge/client, worker wiring, and the legacy StellaOps.RuntimeInstrumentation.Tetragon adapter slice (which still contains Kubernetes API/watch source classes that are historical and out of active scope). The remaining product boundary is the production downstream IRuntimeEvidencePublisher implementation (Signals/Scanner/Policy/EvidenceLocker/Attestor wiring); the default registration is NoopRuntimeEvidencePublisher.

Data Flow

[Linux container host]                         [Windows container host]
        |                                                |
        v                                                v
[Stella Ops Linux agent]                       [Stella Ops Windows agent]
        |                                                |
        | local runtime status                           | local runtime status
        | optional Tetragon sensor input                 | Windows runtime/sensor inputs
        v                                                v
[Agent.Core observation contracts]             [Agent.Core observation contracts]
        |                                                |
        +--------------------+---------------------------+
                             v
                    [Digest gate]
                             |
              only sha256 digest-backed evidence
                             v
                    [Evidence publisher]
                             |
        +--------------------+---------------------------+
        v                    v                           v
    [Signals]            [Scanner]                    [Policy]

Tetragon appears only inside the Linux host path as an optional sensor input:

[Tetragon on Linux host]
        |
        v
[Tetragon bridge]
        |
        v
[Stella Ops Linux agent]

If Tetragon is absent, unsupported, or disabled, the Linux agent must still operate with local runtime status and any other approved local sensor inputs.

Agent.Core Contracts

Agent.Core defines stable contracts before the Linux and Windows agents diverge. The source lives under src/RuntimeInstrumentation/StellaOps.Agent.Core/, with contract tests under src/RuntimeInstrumentation/StellaOps.Agent.Core.Tests/.

Agent.Core must be free of Kubernetes types and free of Tetragon-specific types.

Linux Host Agent

The Linux host agent should be a Stella Ops owned service, normally installed through package/service tooling rather than Kubernetes resources.

Responsibilities:

The Linux agent is not Tetragon. Tetragon can improve Linux visibility, but the agent must remain useful without it.

Current base implementation:

Windows Host Agent

The Windows host agent is a Stella Ops owned Windows Service-style host base, normally installed through Windows service/package tooling rather than Kubernetes resources.

Responsibilities:

Tetragon is Linux-only and must not be used as a Windows agent dependency.

Current base implementation:

Runtime Status Sources

Runtime status sources establish image identity and host/container context. They do not by themselves prove reachability.

Supported direction:

The binding source matrix is maintained in Runtime Status Source Matrix. New source implementations must update that matrix before being marked active.

Rejected direction:

Digest-Gated Evidence Publication

Runtime evidence must be keyed by immutable image digest. The publication path must reject or quarantine observations when:

Evidence publication should include deterministic event ids, source identity, host identity, agent version, runtime status version, observation time, sequence number, digest, and verification metadata so downstream services can replay and audit release decisions.

Current RuntimeInstrumentation implementation:

Optional Tetragon Bridge

The Tetragon bridge is a Linux-only sensor bridge. Its job is to translate local Tetragon output into Agent.Core observation contracts and then let the Linux agent apply the normal digest gate and publisher rules.

Current implementation lives in src/RuntimeInstrumentation/StellaOps.Agent.Tetragon/ and is wired into the Linux agent only when RuntimeInstrumentation:LinuxAgent:TetragonBridge:Enabled=true (bridge options under RuntimeInstrumentation:LinuxAgent:TetragonBridge, export-client options under their own section). Disabled or absent Tetragon leaves the Linux agent with zero optional observation sources and does not block startup. The bridge (TetragonRuntimeObservationSource) reads local Tetragon export output through a named HttpClient (StellaOps.Agent.Tetragon) with bounded reads, maps supported events into Agent.Core RuntimeObservation, and reports observed/dropped/malformed/disconnect counters — plus a TruncatedStackFrames counter — through ITetragonBridgeHealth/TetragonBridgeHealthSnapshot. It never publishes downstream.

Event normalization (TetragonRuntimeObservationAdapter) hoists the canonical process_kprobe wrapper and maps events to a RuntimeObservationKind. Non-kprobe events map by event type (process_execProcessStarted, process_exitProcessExited, tcp_connect/network_connectionNetworkConnection, file_access/file_openFileAccess); kprobe events map by function_name (PHASE-C: e.g. sys_execveProcessStarted, tcp_connectNetworkConnection, do_filp_openFileAccess, with unknown hooks defaulting to ProcessStarted). Events missing a container id are dropped (tetragon_bridge.container_missing); over-large events are dropped (tetragon_bridge.event_too_large). For kprobe events the adapter extracts stack_trace_user/stack_trace_kernel frames (PHASE-B), truncating each list to 256 frames and surfacing the overflow count, and derives the StackCaptureMode from resolved-symbol coverage. Tetragon emits addresses-only frames; symbol resolution is applied downstream.

Symbol upgrade (Sprint 022 PHASE-D): when the bridge is enabled, AddStellaOpsLinuxSymbolResolver registers the file-backed IProcessSymbolResolver (ProcessSymbolResolver) and RuntimeObservationSymbolUpgrader, and a SymbolResolutionObservationFilter is registered into the Linux agent’s IRuntimeObservationFilter pipeline. The resolver walks /proc/<pid>/maps and the matching ELF symbol table (StellaOps.Agent.Linux.SymbolResolver, with ProcMapsParser, ElfSymbolTableReader, and DwarfLineReader internals) to upgrade addresses-only frames to partial-symbols/full-symbols. It is best-effort and failure-tolerant (a failed lookup returns the input frame unchanged; Line is always null pending DWARF support). Bounds are configured via RuntimeInstrumentation:LinuxAgent:SymbolResolver (ProcessSymbolResolverOptions): 100 ms per-frame timeout, 256 frames per call, 64 cached ELF files, 10 MB cached symbol data, 256 cached process maps, ProcRoot default /proc. No Tetragon means no resolver wiring (disabled-by-default invariant).

Implementation rules:

Tests and CI

Required test layers:

CI must not require Kubernetes or Helm for RuntimeInstrumentation verification.

References