Graph-driven OS
Boot order, units, health, and the tool floor are compositions of a typed graph. The machine does not read unit files — only a content-hashed export.
Pure graph product: change the profile or registry, re-export
numos.state, repack, re-verify. Hand-editing state fails closed.
Why this is literal
- No unit files on the target. No
/etc/systemd, no ad-hoc rc that invents boot order outside the export. - One wire format.
numos.stateis line-oriented so the shell floor can parse it withcut/grep. - Hash seal. The
Crecord is SHA-256 of the body; Python export and shell boot must agree. - Profiles are subgraphs.
self-initcompletes offline;fleetadds net/clock/join and optional op catalogue;privacy-workstationis Algoblocker layer 3 (no join).
Quartet mapping
| Layer | Node kinds | Boot role |
|---|---|---|
| META | DistroProfile, FloorProvider, KernelProvider | product, floor, third-party kernel pin |
| GENESIS | BootPhase (+ media) | ordinal walk; ISO uses graph kernel |
| MGS | OSUnit | oneshot / longrun; requires DAG |
| SHADOW | HealthPredicate | steady probes; local_action |
ASEC + kernel (Spec 1)
The kernel is not built by NumericalOS. It is a graph-pinned
third-party artifact (distro.kernel.json) so ISO/QEMU media is
reproducible. ASEC residuals stay named: optional package sha256, no Secure Boot
chain, no non-x86_64 providers until declared.
py -3 -m numos.distro --profile self-init kernel --arch x86_64
self-init profile (complete offline)
Phases mount → identity → complete
(hold longrun). Observed under QEMU x86_64: kernel+initrd and hybrid ISO serial
both reach boot complete degraded=0.
flowchart TD
%% self-init (export product)
PH_mount["P10 mount"]
PH_identity["P20 identity"]
PH_complete["P30 complete"]
PH_mount --> PH_identity --> PH_complete
U_mount_proc("mount-proc\noneshot")
U_mount_sys("mount-sys\noneshot")
U_mount_dev("mount-dev\noneshot")
U_identity("identity\noneshot")
U_hold("hold\nlongrun")
X_hold_alive{{"hold-alive"}}
U_mount_sys --> U_mount_proc
U_mount_dev --> U_mount_proc
U_identity --> U_mount_proc
U_hold --> U_identity
U_hold -.-> X_hold_alive
PH_mount -.-> U_mount_proc
PH_identity -.-> U_identity
PH_complete -.-> U_hold
requires edges point to dependencies (Kahn order
at boot). Health edges are dashed.Export artifacts
Besides numos.state, export writes packer and tooling sidecars:
| file | role |
|---|---|
numos.state | boot wire format (only file PID 1 needs) |
numos.state.json | structured view for tools |
distro.floor.json | numos-floor URL, sha256, applets |
distro.kernel.json | third-party kernel URL, kind, extract rule, ASEC residuals |
distro.profile.json | profile metadata |
distro.graph.json | nodes + edges (META/GENESIS/MGS/SHADOW) |
distro.graph.mmd | Mermaid flowchart of the profile |
py -3 -m numos.export_state --profile self-init --seed-only --out dist py -3 -m numos.distro --profile self-init mermaid py -3 -m numos.distro list
What is not graph (named residuals)
- Kernel is third-party (e.g. Debian
linux-imageon ISO path). - Floor implementation may be a multi-call BusyBox build; product name is
numos-floorwith license + source offer on the floor record. - Metal and non-x86_64 boots are unobserved until
numericalos-verify-bootrecords them.
Deep design: docs/GRAPH.md in the source browser; format details on the state format.