ITISYOU_OS

System Platform

Authority is explicit, delegated narrowly, checked in the kernel, and audited — for every process, and for an AI agent equally.

v1.0.0 · milestone “V1.0 — Experimental Personal OS (VM-verified)” · everything below is machine-verified in QEMU (ADR-0012)

01 // CAPABILITIES

Thirteen syscalls need no capability, because each acts only on the caller itself: write (fd 1, its console output), exit, yield, getpid, uptime, args (its own arguments), sleep, udp_close (a socket it already owns), and cap_list, cap_check, cap_revoke and cap_restrict (its own handles, which it can inspect, drop or narrow but never widen). The thirteenth, console_read, is limited instead to the one process the kernel has lent the console’s input; anyone else gets ERR_PERM, audited. Every other syscall is default deny: the caller must hold a live capability handle of the right kind, rights and scope, or it gets ERR_PERM and the refusal lands in the audit trail, enforced in the kernel’s syscall layer. Delegation only narrows: spawn inherits the parent's set exactly (in v1.0.0, minus the two console-only capabilities), and spawn_caps grants parent ∩ requested. A child can never hold what its parent lacked.

Defined capabilities
Capability Grants
spawn create + wait on child processes
ipc message-channel send/receive
gui window create/draw/present
dev device-table queries
fs_read filesystem reads (within the sandbox prefixes)
fs_write filesystem writes to the persistent store (V0.8)
network UDP sockets and DNS — scoped to a port (V0.8); TCP connect and listen — scoped to the port the connection is opened for (V0.9)
audio reserved — no userspace audio syscall yet
sys_admin reserved — userspace service/package control
proc_control reserved — process teardown and control beyond spawning and waiting (the process kind’s CONTROL right: ending an existing process). No syscall checks it yet: Ring 3 has no kill, and kill is a kernel-console command
service the supervisor report to the kernel’s service table (svc_report, V0.10); in v1.0.0 also init’s kernel mailbox (init_ctl), which in addition requires the caller to be the live /sbin/init
sys_view the approved read-only system view (sys_view) — V0.11, shipped in v1.0.0. Console-granted only: in no default set, never delegated to a child, refused in /etc/init.conf
propose filing a proposal for the console to approve or deny (propose) — V0.11, shipped in v1.0.0. Console-granted only, like sys_view; a proposal grants nothing by itself

Trusted kernel-shell launches keep a legacy-full set so earlier milestones' behavior is unchanged; platform launches are default-deny — an app receives only what its manifest requests and its launcher actually holds.

02 // SYSTEM SERVICES

Services are ordinary Ring 3 processes — no hidden privileged daemons. A static registry declares each service's binary, dependencies, and the exact capabilities it runs with. The supervisor starts them in a deterministic, cycle-checked dependency order, contains crashes, and applies a bounded restart policy (3 restarts, then Failed — no restart storms). The svc command shows the real state table.

Since v0.10.0 the persistent services are started by /sbin/init — pid 1, an ordinary Ring 3 program with fixed authority — from /etc/init.conf, each with exactly the capabilities the file gives it. Init reports every start, restart and failure to the kernel, which checks that the process is init's own child and prints the capabilities from its own record; if init dies, the kernel ends its services and starts a new init.

// real supervised run (QEMU serial evidence)

[ITISYOU:SVC] start name=echod pid=30 order=0 caps=0x2

[ITISYOU:SVC] start name=client pid=31 order=1 caps=0x2

[ITISYOU:SVC] start name=crashd pid=32 order=2 caps=0x0

ECHOD-SERVED-3 · SVC-CLIENT-OK

[ITISYOU:SVC] name=crashd state=restarting pid=33 restarts=1

[ITISYOU:SVC] name=crashd state=restarting pid=34 restarts=2

[ITISYOU:SVC] name=crashd state=restarting pid=35 restarts=3

[ITISYOU:SVC] name=crashd state=failed pid=35 restarts=3

[ITISYOU:SVC] supervisor done started=3 done=2 failed=1 restarts=3

03 // APPS, PACKAGES, UPDATES

An application ships as one ITPKG file: a strict manifest (name, version, requested capabilities — unknown keys or capabilities are errors, never silently tolerated) plus the ELF payload, integrity-protected by SHA-256 and re-verified at every launch. The persistent store keeps version-numbered packages with commit markers; install, update, rollback, and recovery are each one crash-atomic filesystem transition — an interrupted update can never activate.

Honesty note: SHA-256 is integrity, not authenticity, so since V0.8 a package also carries an Ed25519 signature, checked after the digest. Since v0.9.0 the kernel trusts only an offline root, and signing keys only through root-signed certificates limited by package-name scope and release-epoch validity, subject to a signed revocation list (ADR-0021). v0.8.1 checks against one compiled-in development key whose seed is published: the mechanism is real, that key anchors no trust.

// real lifecycle (QEMU serial evidence)

[ITISYOU:PKG] install name=hello-app v=1 result=ok

[ITISYOU:PKG] verify result=refused reason=DigestMismatch

[ITISYOU:PKG] launch name=hello-app v=1 caps=0x10 · HELLO-APP-OK

[ITISYOU:PKG] install name=hello-app v=2 result=ok

[ITISYOU:PKG] rollback name=hello-app from=v2 to=v1 result=ok

// after a simulated crash mid-update + REAL reboot:

[ITISYOU:RECOVERY] app=hello-app orphan_staged=v2 action=remove

[ITISYOU:PKG] launch name=hello-app v=1 · HELLO-APP-OK

04 // VERIFIED SECURITY PROPERTIES

Default deny

VERIFIED

A probe launched with ZERO capabilities attempts all 7 privileged syscall classes; every one must return ERR_PERM.

SANDBOX-DENIED-OK (exit 0 only if all attempts were denied)

No amplification

VERIFIED

A parent holding only {spawn, fs_read} requests gui for its child; the kernel intersects — the child finds gui denied while its delegated fs_read works.

CAP-DELEGATION-OK

Sandbox traversal defense

VERIFIED

A process sandboxed to /etc attempts /bin, a foreign app dir, /etc/../bin/init, and a root escape — all denied on the NORMALIZED path; an in-sandbox miss stays NOENT.

FS-SANDBOX-OK

Service supervision

VERIFIED

echod serves a dependent client (3 IPC ping→pong); crashd faults, is contained, restarted exactly 3× by the bounded policy, then marked Failed. Startup order is dependency-driven and cycle-checked.

ECHOD-SERVED-3 · SVC-CLIENT-OK · state=failed restarts=3

Package integrity

VERIFIED

A bit-flipped package (digest mismatch) and a digest-valid package demanding an undefined capability are both refused — with the store untouched. The digest is re-verified at every launch.

verify result=refused reason=DigestMismatch

Manifest-only authority

VERIFIED

hello-app is granted exactly its manifest capability (fs_read works) and nothing more (its gui attempt is denied even though the binary asks).

HELLO-APP-OK

Atomic update + rollback

VERIFIED

Updating stages the new version, then commits with ONE crash-atomic filesystem transition. Rollback removes the newest commit marker: the previous version reactivates and the demoted package is kept as evidence.

rollback name=hello-app from=v2 to=v1 result=ok

Reboot-proven recovery

VERIFIED

Boot 1 installs v1 and stages v2 WITHOUT committing (a simulated crash mid-update), then powers off. Boot 2 finds v1 still active, detects the orphaned staged update, removes it via the recovery scan, and launches v1.

[ITISYOU:RECOVERY] orphan_staged=v2 action=remove

Audit trail

VERIFIED

Every privileged action and every capability denial is recorded: sequence, tick, pid, action, capability, result. No payload contents are logged.

[ITISYOU:AUDIT] seq=… pid=… action=… result=denied

Each property above is asserted by the automated QEMU matrix (in-kernel selftests plus dedicated platform and two-boot update/recovery legs) on every CI run — a property is listed here only while its test stays green.

05 // AI ≠ AUTHORITY

The platform's privileged path — request → identity → capability check → deterministic service → action → audit — is the only privileged path. An AI agent gets no other entry point: it requests actions exactly like any untrusted application, subject to the same default-deny capabilities, the same sandbox, and the same audit trail. The released v0.10.0 image contains no AI component.

In v1.0.0, the first agent works exactly this way. It holds the view and the right to propose, both console-granted only, plus IPC and reads under /etc/ai; its own attempts at svc_report, fs_write and spawn are refused, and no syscall it can call performs either of its two actions — resuming the scheduler, retrying a failed service. Inference runs in Ring 3, in inferd under /sbin/init; the kernel only re-evaluates the pinned model on the view it served, to check the agent’s claim, and never acts on a model’s output. A proposal the kernel accepts waits for approve or deny at the console; an approved action runs in kernel code, is verified, is rolled back if the check fails, and each step is audited with the model and view digests the proposal cited.

Source: docs/SECURITY_MODEL.md · ADR-0012 · evidence in the repository's artifacts/qemu/ JSON + serial logs