Q103 failed to seed once in an audit of six hosts at a time: a minute
passed without a Falco alert naming the Pod. When that happens, the
setup now replaces the Pod - a new container, which Falco's container
plugin looks up afresh - and waits one minute more before it gives up.
Record the final audit in README.md and CHANGELOG.md: CKS 110/110 on
v1.37, Q103 passing alone and with the other seven VM tasks six at a
time, and CKA Q132, CKAD Q1 and CKS Q60, Q61 and Q64 passing on the
images rebuilt with hexdump and xxd.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HDuDkQHyHPvYZQAE1z5CF2
Add lessons: untimed guided labs, one per curriculum objective, on a
host of their own, in the browser and in the terminal. Each step has
a check, a hint and its commands; a lesson writes no history or
scores, only a done mark on its objective. CKAD 2.1-2.4 (24 steps)
and all 27 CKA objectives (135 steps) have one, and `./ksim lesson
audit` proves that every step fails, is done by its own commands,
then passes.
Add CKA tasks 132-147 (cka/bank_course.py) on what a full CKA course
teaches beyond the bank: a real upgrade from v1.36, a drain under a
PodDisruptionBudget, QoS and eviction, in-place resize, kube-proxy's
chains, encryption at rest, an operator, and CSI expansion, snapshots
and clones (ensure_csi_hostpath).
Move CKA and CKS to Kubernetes v1.37 and rebuild the hosts on Ubuntu
24.04, with kubelet, kubeadm and kubectl as held packages from
pkgs.k8s.io; the desktop runs Ubuntu too. Hosts gain man pages,
hexdump and xxd.
Fix CKS Q4, which gave 3 of 12 points untouched, and CKA Q4 and Q49,
whose solutions raced their new CRD.
Audited on v1.37: CKA 147/147, CKAD 105/105, CKS 109/110 (Q103, a
Falco task, failed to seed once and awaits a re-audit); lessons: 135
of 135 CKA steps and 24 of 24 CKAD steps.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Study mode is gone: no more untimed sessions with the reference
solutions open from the start. The path is now objective drills against
the clock, then a mock, then the fixed sets, and an objective is done
when every task passed on its latest timed attempt. In the lobby "Study
mode" becomes "Drill an objective" (the objective list, with one
"Against the clock" button per objective); ./ksim study is removed and
./ksim next always drills. study-<track>.json keeps focus, known and the
done stamps; results of old study sessions stay in it, read by nothing.
Also in this commit, from the work before it:
- ./ksim skip / unskip, and links beside each domain in the lobby: mark
a domain or an objective as known, so the path, the no-argument drill
and drill all leave it out; a mock still draws from every domain
- DOMAIN:N picks N tasks of a domain, spread over its objectives
- a command with neither --track nor KSIM_TRACK is for the track whose
session is under way; ./ksim show says where the task's host resolves
- CKAD Q60: the check names which file holds which run's output
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JZPd3GGWyxTgAkL6a4gAJz
kubestronaut-sim runs each exam task on a host of its own - a kind (kubeadm)
cluster in rootless podman, or a QEMU/KVM Ubuntu VM for the CKS tasks that
need their own kernel (Falco, AppArmor) - and puts a browser desktop in front
of them, the way killer.sh and sailor.sh do.
- ksim, sim/: the engine (sessions, drills, study mode, grading, coverage,
audit), host and VM lifecycle, the desktop
- images/: exam host images (common, CKS variant with its tools, VM guest)
- cka/ (131 tasks), ckad/ (105), cks/ (110): task banks, curricula with
study notes, reference solutions and scripted solutions
Every domain of every track has at least 17 pool tasks. `./ksim audit` proves
a task three ways: it seeds cleanly on its own host, scores nothing before
anyone has worked on it, and reaches full marks when its scripted solution is
run on the host as `candidate`. All 346 tasks pass (CKA audited 2026-10-13,
CKAD and CKS 2026-10-12).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JZPd3GGWyxTgAkL6a4gAJz