Gaps to host apps — and no containers
Do not say “you can run host apps on ctos.” A host app here means a program you already run on Linux or macOS: a shell, Python, a browser, a Docker/OCI container, a glibc ELF you exec. Today’s guest can run the probed samples only. Closing the gap is Planned in pieces, not a product claim.
./scripts/docker-smoke.sh is a host harness (build the kernel inside a Linux container, then QEMU). It is not a guest container runtime. ctos is not a container host.
Hub: overview.md. Porting: building-or-porting.md. Filesystem: filesystem.md.
Site source of truth: Hosting apps / containers. Product “hosting done” claim: Verified under ADR-048 / ADR-052 (freestanding slots; containers remain non-goal). This page is extra stance. HTTPS at https://ctos.artof.link is Verified (2026-09-11 after #30).
What a host app needs vs what exists
| Need (typical host app) | On ctos today | Status |
|---|---|---|
A process you exec | Standing EL0 + A1 ABI + A2 libctos + A3 PT_LOAD + A4 standing task + A9 FAT /hello first cut | Planned as Linux exec. Stance: ADR-035. A9 is two artifacts + a FAT load path, not a process table. |
| POSIX / glibc / musl | Custom aarch64-ctos.json, os: none, no libc | Not easy, not started. |
Files (open / a disk) | Thin VFS: memfs + FAT16 (read + write depth, ADR-050) | memfs + FAT miles (A6/A7 + ADR-050). Not POSIX. |
| Sockets / HTTP | No virtio-net, no stack | Planned at best; not a Now mile |
| Shell / TTY / Python | One injected UART byte; no interpreter | No until ABI + FS + line discipline |
| Isolated userspace | Standing miles + identity tears incl. leftover RAM (ADR-049); PAN enabled on a76 (ADR-080); _start stays | Umbrella “EL0 isolated” Verified only as the accepted ADR-091 sentence (one core, TCG; limits there) |
| Preemption / SMP | Cooperative EL1, one vCPU | No on this horizon |
| Containers (OCI / Docker / k8s as the guest) | Nothing | Non-goal. See below. |
The easiest thing you can add today is still an in-tree no_std coop EL1 task — not a host binary.
Containers: non-goal
ctos will not run containers as a guest feature. This is a non-goal, not “later on this horizon.” ADR-029. Site SoT: hosting-apps.md.
- No OCI image pull, no
runc, no cgroups, no Linux namespaces, no overlay FS, no containerd/CRI. - A Linux Docker/Podman host that builds this kernel is unrelated. That smoke does not make QEMU
virta container host. - “Run Alpine on ctos” / “k8s node” is the same class of claim as “POSIX port is easy.” It is not.
Do not write a container roadmap. Track A gaps (ABI, FS, isolation) are not a path to OCI. Do not mint a new FR ID for containers. Reopen only with a new GitHub epic plus a new ADR.
Honesty
| Claim | Probe | Status |
|---|---|---|
| Guest is not a container host | Source: no OCI/runc/cgroup/namespace code in src/ | Verified (absence) |
Host docker-smoke.sh builds the kernel | Ledger Docker rows (sponsor / GHA) | Separate claim — host harness only |
| A host app (Linux ELF, shell, Python) runs in the guest | No such serial marker | Planned |
| Guest is a container host | No OCI/runc/cgroup code | Verified absence; non-goal (ADR-029; not a later Planned feature) |
| Linux-compat goals documented (Track B B1) | Read ADR-031 | Documented frame. Not Linux userspace. B6 stays Planned research. |
| Linux AArch64 vs ctos SVC gap (Track B B2) | Read linux-aarch64-syscall-gap.md | Documented inspection map. No Linux numbers in src/. Not a Linux ABI. |
| Process model vs standing EL0 (Track B B3) | Read ADR-035 | Documented stance. Standing EL0 stays the ctos model. Not fork/execve/wait. |
Linux ELF / auxv / PT_INTERP vs freestanding loader (Track B B4) | Read ADR-033 | Documented gap ADR. Track A loader stays reusable. Does not accept PT_INTERP. Not dynamic Linux ELF. |
| Linux VFS vs thin ctos VFS (Track B B5) | Read ADR-034 | Documented concept compare. No POSIX flags / dentries in src/. Not a Linux filesystem. |
File presence of this note is not an app runtime. See the honesty ledger.