Every "Test Your Understanding" quiz placed the correct answer in option B.
Across the 2026 questions in 338 quiz files the correct answer sat at index 1
in 61.5% of cases (uniform would be ~25%), and 107 files had every answer at B,
making the quizzes guessable without reading them.
scripts/debias_quizzes.py rewrites each question's option order with a
deterministic, content-seeded permutation and updates the correct index to
follow the moved answer. It is idempotent: options are canonicalised to a sorted
base before permuting, so re-running produces byte-identical output. Questions
whose options reference each other by position ("all of the above", "both A and
B") are left untouched. The correct-answer value, the option set, and every
explanation are preserved exactly; only order and the index change.
Result: A 23.8% / B 26.3% / C 23.5% / D 26.4%.
The script doubles as a CI guard: `--check` exits non-zero if any quiz is not
de-biased, wired into the curriculum workflow so new lessons cannot regress.
Fixes#368
Book pipeline: six-volume EPUB/PDF compilation built by CI from lesson
sources (book/, scripts/build_book.py, themed title pages with edition
stamps, site-matching print theme), attached to every GitHub release.
Homepage Books section and README section link the latest release.
Fundamentals-first headline policy across the course: 16 lesson titles
and 30+ taglines/section headings now lead with the concept (agent
state machines, actor model, role-based teams, memory paging, serving
engine internals, permission modes); framework and product names are
demoted to attributed in-body examples. README, ROADMAP, quizzes, and
prerequisite references synced. New agent-memory taxonomy section maps
memory types to representative implementations.
Vendor-neutral model policy: runnable defaults read the LLM_MODEL env
var with undated aliases; dated snapshot ids removed; multi-provider
phrasing in the setup lesson.
Lessons deepened with original material: prediction-game origins of
perplexity (05/16), scripted-era chatbot lineage 1950-2001 (05/17),
causal-triangle derivation from prefix averaging plus GPT-5 date fix
(07/07). Three new animated site figures back them (figures-history.js).
llms.txt now carries per-lesson raw markdown links so agents can fetch
full lesson text directly.
Bug fixes verified with executed repros: capstone solved flag keyed to
test results, 405B cost estimator overflow, f-string crash on
Python <3.12, no-torch demo path, negative stable BCE, all-zero
stationary distribution, inverted Cohens d, per-lesson quiz panel,
lesson-fetch retry with honest errors, decision-trees doc completed,
editor shortcuts, rustc run command, Docker python3.12 build with doc
sync, git lesson fork flow, FIPA receiver field, fnm under Rosetta,
15 curl-verified link fixes, remaining imdb dataset id spot.
The 10 audit findings in phase 05 all pointed at SVG assets that were
never created. Nine were broken image embeds (./assets/<name>.svg) and
one was a code-fence false positive where '[tool_name](**args)' inside a
Python snippet looked like a Markdown link to the audit's regex.
This commit:
- Removes the nine broken figure embeds across lessons 01-09. The
surrounding prose stands on its own; no caption text needed rewriting.
- Splits the offending Python expression in lesson 17 onto two lines
(fn = tools[tool_name]; result = fn(**args)) so '](**args)' no longer
appears as adjacent characters.
Three fixes from CodeRabbit review.
1. DialoGPT-medium with pipeline('text-generation') produces off-topic
continuations because turn separators and EOS config are missing.
Swap to google/flan-t5-small via text2text-generation for a coherent
out-of-the-box teaching example.
2. Split the dense prompt-injection paragraph into four paragraphs:
attack vectors, measured success rates (contextualize 84% vs broader
0.5-8.5% range, name EchoLeak CVE with CVSS 9.3), mitigations, and
the hard limit (no prompt engineering fully eliminates; external
runtime defenses required).
3. Note that the retrieval-based FAQ snippet requires installing
sentence-transformers and that the lesson's runnable main.py uses
stdlib Jaccard so readers know what is illustrative vs runnable.
docs/en.md and assets/ are sibling directories under each lesson dir.
GitHub's markdown renderer resolves ./assets/ from docs/en.md to
docs/assets/ (which doesn't exist), breaking every SVG in the rendered
lesson. Change all image references to ../assets/ so the rendered
markdown actually finds the SVG.
Verified via GitHub's rendered HTML: ./assets/pipeline.svg was
resolving to /.../docs/assets/pipeline.svg (404). After fix, resolves
to /.../assets/pipeline.svg (200).
Caught by CodeRabbit review of PR #48 (flagged lesson 16; same bug
applied to all other lessons in the branch).
Walks the four-paradigm evolution: rule-based (ELIZA pattern matching
in 20 lines), retrieval-based (FAQ with similarity threshold), neural
seq2seq (and why it loses solo), LLM agent loop (plan → tool → verify).
Working demo: hybrid routing that sends destructive actions to
structured flows, FAQs to retrieval, and ambiguous queries to an LLM
agent fallback. This is the 2026 production pattern.
Names five failure modes still shipping: confident fabrication, prompt
injection, scope creep, infinite loops, context window exhaustion.
Each with mitigation.
Ship artifact: chatbot-architect skill that refuses pure-LLM agents
for destructive actions without structured confirmation flows and
requires prompt-injection audit for any write-access agent.
~75 minutes. Prerequisites lesson 05/13 and 05/14.