Every lab states its symptoms, never its causes. The faults are listed here for people choosing what to learn next — inside the lab you only ever see what the machine shows you.
Every lab here is unrated: it runs on your own machine, needs no account, and its faults, checks and reference solution are in the repository. Rated labs — the ones a rating is made of — are graded by the server and their answers are not published. What that means.
General troubleshooting and shell work on lighter images: Ubuntu 26.04 and Alpine.
Find what is using disk space when df and du disagree
Keep a systemd service running across crashes and reboots
Quote variables so file names with spaces survive
Process text with pipelines: filter, count, sort
Put exactly the right people in a group
Find out why logrotate ignores or skips a configuration
Five labs on Rocky Linux 10, grounded in the current EX200 objectives, ending in a timed exam simulation.
Create, delete, and modify local groups and memberships
Start and stop services; configure automatic startup
Configure systems to mount file systems at boot by UUID or label
Restore default file contexts
Interrupt the boot process to gain system access
Two deploy-day scripts, graded by running them against the grader's own directories: error handling, quoting, atomic switches, safe deletion.
Stop a script at the first failure and report it with a non-zero exit status
Select files by the data in their names, not by incidental metadata
Walk a directory tree in a shell script without breaking on any file name
Write a script that does not depend on the caller's environment or working directory
Publish a file only when it is complete, in one step
Tell 'nothing matched' from 'something failed' in a pipeline under set -e and pipefail
Substitute any value into a template literally, whatever characters it contains
A sync job that lied about its failures and a tool only root could run: exit status, timeouts, atomic writes, virtual environments.
Turn errors into a non-zero exit status instead of a false success
Install a Python application into its own virtual environment for every user of the machine
Read and write text files with the encoding stated, not the machine's
Make a long-running program's output appear while it runs, not when it ends
Know where Python looks for a module, and in which order
Keep two copies of the same job from running at once
Keep a credential out of the log, whatever is logged
A Python job, an AI gateway, an agent that never stopped, and Ollama four ways — deployed, exposed, starved of context and memory, and secured.
Run a local model server as a service account that can read its models
Keep an upstream API key out of unit files and out of other accounts' reach
Give an agent only the tools its task needs
Keep an unauthenticated model server off the network
Build a custom model from a Modelfile and read back what the server really holds
Size a model server's context and parallelism to the memory it has
Run a Python job from systemd with the project's own virtual environment
Headless Claude Code as a machine runs it: permission rules, hooks, subagents, MCP servers and CI jobs that stay inside a budget.
Recover work an agent deleted from a git working tree
Make a PostToolUse hook run on the tools it is meant for, with the input Claude Code gives it
Define a project subagent Claude Code can find and delegate to
Configure a project MCP server that starts for a headless run
Trigger a CI agent job only on the event it is for
Enforce a machine-wide policy no project, user or flag can loosen
Model Context Protocol servers as Claude Code meets them: what a server exposes, tool results that give orders, tokens for someone else, a chatty stdio server, a proxy that holds the stream, and scopes that disagree.
Let an MCP server share exactly the folder a job needs, and only for reading
Limit what a fetching MCP server can reach
Make an MCP server accept only tokens issued for it
Keep a stdio MCP server's stdout for the protocol alone
Proxy a remote MCP server's event stream without holding it back or cutting it off
Find which of Claude Code's MCP scopes a server's definition comes from
A playbook that never converges and a deploy stuck at a vault prompt: idempotence, variable precedence, Vault without a keyboard.
A queue that lost its jobs at every reboot and a Compose stack that could not find its API: volumes, published ports, networks, restart policies.
A rename that would regenerate a secret and a site removed from the middle of a list: moved blocks, drift, for_each, state hygiene.
These are the unrated banks: their answers and explanations are in the repository, and the site draws the questions from it. Rated banks are served by the API, a question at a time, and graded there. Single answer or several; every one explains why the tempting wrong choices are wrong. Questions about program output are executed in a sandbox before they are accepted — the answer key has to match what the machine actually printed.
Idempotence, modules, variables and handlers — configuration you can run twice.
41 questions
Expansion, quoting, exit status and the traps that make scripts lie.
42 questions · 34 executable
Claude Code as a machine runs it — headless runs, permissions, settings levels, hooks, subagents, MCP servers, CLAUDE.md, CI jobs and what they cost — and the habits that keep any AI agent on a short leash.
42 questions · 4 executable
Users, permissions, processes, files and boot — the everyday mechanics of a Linux system.
42 questions · 7 executable
MCP as a machine runs it — the two transports, the stateless 2026-07-28 revision, what a server exposes, tool results as untrusted input, OAuth 2.1 for remote servers, and the way Claude Code picks which server to run.
40 questions
Virtual memory, the page cache, processes and scheduling — computer science as Linux shows it.
43 questions · 7 executable
Addresses, routes, sockets, name resolution and firewalls — from a Linux shell.
41 questions · 6 executable
Running language models on your own machine with Ollama — the service, the API, Modelfiles, context windows, memory, keep-alive, embeddings and exposing it safely — and what local models are good for.
40 questions · 3 executable
The Python that automation scripts are made of — and the surprises in it.
42 questions · 34 executable
State, plans and the lifecycle of infrastructure described as code.
41 questions · 1 executable
What does this print?
x=5
x+=1
echo "$x"
51
On an ordinary variable, += appends a string: "5" followed by "1". Arithmetic needs an arithmetic context — ((x+=1)) or x=$((x+1)) — or a variable declared with declare -i.
man 1 bash (Parameters) · executed in a sandbox