These labs are written for a reader who has cloned SlOS and wants a practical route
through boot, causal history, durable journals, time travel, remote shells, the web explorer, SlFS,
user programs, actors, mesh identity, and the showcase references.
Run the commands exactly at first. Record event IDs as they appear on your machine. When
a lab asks for <event-id>, choose a recent event from the preceding
events output.
SlFS state lives in disk.img. Keep it between reboots for persistence labs,
and reset it when you intentionally want a fresh filesystem.
Lab 01
Boot and identify the machine
Purpose
Establish a clean QEMU session, confirm the kernel reached the shell, and record the machine identity before changing state.
actors prints active local and remote actors, message counters, and mailbox depth. The shell, kernel, fs, net, mail, and dead-letter actors are useful landmarks.
send shell queues a message. recv shell consumes it and prints sender, timestamp, and payload details.
mesh prints the local SPIFFE ID, public key, and peer table. A single-node run may report no discovered peers; a multi-node run lists peer state and transport.
Source files to read next
kernel/graph/actor.c
include/actor.h
kernel/graph/mesh.c
include/mesh.h
kernel/graph/federation.c
Cleanup / reset
Run recv shell until the lab message is gone if you repeat the test. No persistent file state is created.
Lab 07
Watch causality in a browser
Purpose
Start the HTTP server, open the live Web Causal Explorer, scrub reconstructed state, and focus a node to inspect causes and effects.
Commands
# SlOS shellifconfighttpdhttpd dump graphhttpd dump state 0# host browseropen http://<slos-ip>/causal# in the web page# 1. watch the SVG DAG refresh# 2. drag the time-travel slider# 3. click a node to focus causes/effects# 4. compare with /api/causal/graph and /api/causal/state
Expected observation
httpd starts the userspace server; httpd dump graph and state validate the endpoint builders from inside SlOS.
/causal renders a live SVG DAG from /api/causal/graph and shows state from /api/causal/state.
The slider requests /api/causal/state?tick=N. Clicking a node highlights its local causes and effects.
Source files to read next
programs/httpd.c
kernel/apps/cmd_net.c
scripts/web-explorer-check.mjs
docs/causal-inspector.md
Makefile
Cleanup / reset
Stop QEMU when finished. If the server task remains active during the session, reboot or halt for a clean shell.
Lab 08
Durable history across reboot
Purpose
Emit events, spill or read them through the durable journal, reboot on the same disk, and prove archived history still explains activity.
Commands
events 8journaljournal spill-through lastjournal statsevents -a sched 4why -a lastjournal proof-healthjournal json selfcheckhalt# host terminal after QEMU exitsmake run-nographic# SlOS shell after rebootjournalevents -a sched 4cq -a id=last epoch-proof --json-ishwhy -a last
Expected observation
journal shows active CJournal status and records persisted to SlFS.
events -a reads archived records, not only the current in-memory ring. why -a can explain using durable read-through history.
After reboot on the same disk.img, journal and cq -a still find persisted events and proof metadata.
Source files to read next
programs/shell.c
kernel/graph/causal.c
docs/manuals/VALIDATION.md
docs/JOURNAL.md
Makefile
Cleanup / reset
Keep disk.img for follow-up persistence tests. To reset durable history, intentionally reset disk.img before booting again.
Lab 09
Counterfactual: scrub whatif / whatif
Purpose
Ask which downstream events would be affected if a selected event were removed from the causal graph.
scrub event last prints event details, parents, and effects.
scrub whatif last and whatif <id> report the downstream impact and verdict for removing an event.
scrub diff and scrub json expose scriptable reconstructed state for comparing ticks.
Source files to read next
programs/shell.c
kernel/apps/cmd_graph.c
kernel/graph/replay.c
docs/causal-inspector.md
Cleanup / reset
No state is changed by the counterfactual query. New events produced by the commands simply advance the ring.
Lab 10
Save a lens and reuse it after reboot
Purpose
Persist a named causal query to SlFS, reboot on the same disk, and run the saved query again.
Commands
lens save faults events 5lens listlens run faultshalt# host terminal after QEMU exitsmake run-nographic# SlOS shell after rebootlens listlens run faults
Expected observation
lens save stores the command under the chosen name. lens list shows the saved query.
After reboot, lens list still shows the entry loaded from /lens.db on SlFS.
lens run faults dispatches the stored command through the shell command table.
Source files to read next
programs/shell.c
docs/implementation/2026-06-12-lens.md
docs/manuals/VALIDATION.md
Makefile
Cleanup / reset
Run lens rm faults if you want to remove the saved query. It is intentionally persistent.
Lab 11
Compose shell filters with sequential pipelines
Purpose
Use cmd1 | cmd2 with stdin-aware filters while remembering the implementation is sequential capture, not POSIX pipes.
The video frames give approximate screen shape, command order, and output density for each topic.
Local event IDs, ticks, IP addresses, peer IDs, file sizes, and task numbers may differ from the recordings.
When a local result differs, prefer current source and command output, then use the reel to orient what to inspect next.
Source files to read next
programs/showcase.c
kernel/apps/demo.c
kernel/apps/cmd_graph.c
programs/shell.c
src/pages/showcase.astro
Cleanup / reset
No cleanup is needed. If a demo command leaves files or actors behind, use the relevant lab cleanup above.
Lab 13
Operate the causal toolkit
Purpose
Use the operator toolkit end to end: render a verdict, bisect replayable history, debug causes, profile flow, and seal one outcome with a verifiable receipt.
Commands
triagecbisect events 100cdb break type schedcdb runcdb btcprofautopsy lastjournal spill 64journal sign 1attest firstattest verify firstcapsule lastwhy -r last
Expected observation
triage prints one STATUS verdict (HEALTHY/DEGRADED/CRITICAL) and a single next-action command.
cbisect binary-searches the tick timeline, reconstructing state per probe via replay, and reports the earliest tick the metric crossed the threshold.
cdb keeps a cursor and breakpoint across calls; bt walks causes and step walks effects of the current event.
cprof ranks cause-to-effect subsystem boundaries by edge volume and marks cross-subsystem crossings with *.
After spill+sign, attest first prints a SIGNED & VERIFIABLE receipt and attest verify first returns RECEIPT VALID; capsule writes /capsule/<id>.txt; why -r tags each hop origin=local.
Source files to read next
kernel/graph/triage.c
kernel/graph/cbisect.c
kernel/graph/cdb.c
kernel/graph/cprof.c
kernel/graph/attest.c
kernel/graph/capsule.c
kernel/apps/cmd_graph.c
docs/causal-toolkit.md
Cleanup / reset
cdb reset clears the debugger cursor. The /capsule/<id>.txt files persist on SlFS; remove them with rm if desired.
Lab 14
Use SlOS as a remote workstation
Purpose
Connect from the host, edit and run a persistent slosh script, start a detached service, disconnect, and verify the service continues to answer.
Commands
# host terminal Amake run# host terminal B, default QEMU forwardingtelnet localhost 2323# SlOS shell inside telnettermsizemkdir /home/remote-labedit /home/remote-lab/hello.sl# in editor: write a small script, Ctrl-S save, Ctrl-Q quitcat /home/remote-lab/hello.slrun /home/remote-lab/hello.slhttpdexit# host terminal B after disconnectcurl http://localhost:8080/# optional encrypted shell, from the SlOS repopython3 scripts/noise-shell-client.py localhost 5200
Expected observation
telnet reaches the slos:/$ prompt through host port 2323. Multiple remote sessions can be opened in parallel.
termsize reports the negotiated size when the telnet client supplies NAWS, otherwise 80x25. The full-screen editor uses ANSI output and cooked-key input over the connection.
The /home/remote-lab script remains in SlFS-backed persistent storage; /tmp and relative scratch paths would be RAM-backed instead.
After exit closes the remote shell, curl still reaches httpd because service daemons detach from the session. The optional noiseshd path is encrypted with ephemeral X25519 and ChaCha20-Poly1305, but not server-authenticated.
Source files to read next
docs/remote-access.md
kernel/apps/telnetd.c
kernel/core/syscall.c
kernel/drivers/console.c
programs/editor.c
kernel/apps/script.c
kernel/apps/cmd_files.c
scripts/noise-shell-client.py
Cleanup / reset
Reconnect and run rm /home/remote-lab/hello.sl or rm /home/remote-lab if you want to remove the persistent lab file. Reboot or halt to stop service tasks.
Validation evidence exists in the SlOS Makefile: smoke-boot,
manual-smoke, causal-journal-check,
web-explorer-check, and lens-persist-check.