Purpose

Axis is a system for building and operating immutable Linux-based Operating Systems. It comprises:

Scope

The Axis specifications define the architecture, interfaces, artifacts, and runtime behavior required to build and operate immutable Linux-based Operating Systems using Axis. The scope of Axis includes:

Terminology and Normative Language

Axis specifications are normative documents. Unless explicitly stated otherwise, definitions, relationships, constraints, and requirements expressed by a Specification form part of the Axis contract.

A Concept is a uniquely defined entity in the Axis specification model. Each Concept has exactly one canonical definition, owned by a single Specification, and may be referenced from any other Specification.

Concept names use canonical capitalization, such as Axis, Operating System, and Base OS. A lowercase use of the same words does not refer to the Concept unless the context unambiguously indicates otherwise.

Concepts whose canonical names are program or command names are written in lowercase monospace, such as axis and axisd.

The keywords MUST, MUST NOT, SHOULD, SHOULD NOT, and MAY express normative requirements when written in uppercase.

System Model

Axis has two primary responsibilities: producing immutable Operating Systems and operating the Devices that run them.

Projects and Dependencies are resolved and built into immutable Artifacts, including Packages, Operating Systems, Platforms, and Runners. A Platform provides the target-side support required to boot and operate compatible Operating Systems on a class of physical or virtual Devices. A Runner allows axis to operate compatible Devices from a Host, while axisd manages the running Operating System.

A Project is a source-level unit understood by Axis. A Project declares its kind, Dependencies, supported Targets, and the information required to produce its Artifacts.

A Dependency is a declared requirement on another component. Resolution satisfies a Dependency with a compatible Artifact, either by reusing an existing binary Artifact or by obtaining its source and building it.

A Target is a declarative destination context for which a Project is built or prepared. A Target provides the properties required to select compatible Dependencies, Artifacts, and Platforms.

A Build transforms declared inputs into immutable Artifacts. Builds are evaluated only when required, allowing unchanged results to be reused.

An Artifact is an immutable binary value produced, distributed, stored, or consumed by Axis. The principal Artifact kinds are Package, Operating System, Platform, and Runner.

flowchart LR Project["Project"] -->|declares| Dependency["Dependency"] Project -->|supports| Target["Target"] Dependency --> Resolution["Resolution"] Resolution -->|resolves to| Artifact["Artifact"] Resolution -->|may require| Build["Build"] Project --> Build Target --> Build Build --> Artifact

A Package is a reusable Artifact that may participate in the construction of another Artifact.

An Operating System is the complete immutable system Artifact intended to run with a compatible Platform and conforming to the Base OS.

A Platform provides the target-side components and contracts required to boot and operate compatible Operating Systems on a class of physical or virtual machines.

A Runner provides host-side functionality for operating compatible Platforms. Runners are independent from the Platforms and Operating Systems they operate.

A Host is the environment in which axis executes. A Device is a concrete physical or virtual machine on which an Operating System may run; unlike a Target, a Device exists independently of any Project or Build.

flowchart LR Host["Host"] --> Axis["axis"] Axis -->|uses| Runner["Runner"] Runner -->|operates| Device["Device"] Platform["Platform"] -->|supports| Device Platform -->|boots and supports| OS["Operating System"] Device -->|runs| OS OS --> Axisd["axisd"] Axis -->|controls| Axisd class Axis,Axisd program

axis is the developer-facing interface to both sides of the model. It builds and resolves Projects and Artifacts, and may also interact with Devices running Axis-based Operating Systems independently of any Project or Build context.

axisd runs as part of an Axis-based Operating System and provides runtime management and system interfaces to authorized clients.

The core relationships of the Axis model are:

Fundamental Invariants

The following properties are fundamental to Axis. More specific Specifications may refine these requirements but MUST NOT contradict them.

Concept Ownership

Every Concept defined by the Axis specifications has exactly one owning Specification. The owning Specification contains the Concept's canonical definition and is the authoritative source for its meaning.

A Concept MUST be owned by the highest Specification in the specification tree that can define it completely without depending on details delegated to a child Specification.

A child Specification may refine a Concept owned by one of its ancestors by defining more specific behavior, constraints, interfaces, or representations. Such refinements MUST NOT contradict or redefine the Concept established by its owner.

A Specification SHOULD NOT define normative meaning for a Concept owned by another Specification. It may reference that Concept and state requirements concerning its interaction with Concepts that it owns.

When a Concept cannot be defined completely without introducing a separately refinable abstraction, that abstraction SHOULD be defined as a distinct Concept and delegated to an appropriate child Specification.

Changes to the canonical definition of a Concept require review of the Specifications that refine or depend on it.

flowchart TD Parent["Owning Specification"] Concept["Concept"] ChildA["Child Specification"] ChildB["Child Specification"] Parent -->|defines| Concept Concept -->|refined by| ChildA Concept -->|refined by| ChildB

Child Specifications