* fix(book): keep inline table code inside PDF margins
* fix(book): preserve Unicode and fail incomplete PDF builds
* fix(book): wrap inline code in PDF prose without extra symbols
* fix(book): wrap long plain-text identifiers in PDF tables
* fix(book): preserve Unicode sequences in table wrapping
Bump shared asset cache keys and align copied-command guidance with the repository-root contract. Preserve legacy MCP learner state and keep reduced-motion controls accurately labeled.
* fix(i18n): force-add translated lessons past main's inherited .gitignore
The dispatched backfill (run 30768876598, 100 shards, all green) published
nothing: the translations branch was never created (404). Every shard's
publish step logged "no changes".
Root cause: when origin/translations doesn't exist yet, the publish step
creates it from the current checkout, which is main's tree, .gitignore
included. main's .gitignore intentionally excludes i18n/*/phases/ and
i18n/*/.cache/ to keep lesson translations off main, but that same rule
silently drops the plain `git add "i18n/$LANG_CODE"` inside the new
translations-branch worktree, so nothing was ever staged, committed, or
pushed across all 100 jobs.
Reproduced locally (a repo with the same .gitignore + the same add call
reports "no changes"; git add -f stages correctly) before applying the fix.
Force-add: the translations branch exists specifically to hold this content.
* feat(cert/00): add certification strategy
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/01): add product and model selection
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/02): add model routing and token economics
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/03): add prompting and task decomposition
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/04): add context, memory, and caching
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/05): add output evaluation and validation
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/06): add governance and responsible use
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/07): add workflow design and handoffs
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/08): add Messages API lifecycle
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/09): add defensive structured outputs
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/10): add tool use and agent loops
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/11): add MCP server integration
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/12): add Agent SDK harnesses and hooks
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/13): add application security controls
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/14): add evals and observability
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/15): add Claude Code team workflows
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/16): add multi-agent orchestration
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/17): add sessions, subagents, and context
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/18): add resilient tool contracts
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/19): add Claude Code skills and CI
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/20): add extraction, batch, and review
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/21): add long-context reliability
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/22): add discovery and SLA design
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/23): add architecture tradeoffs
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/24): add RAG evidence pipelines
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/25): add least-privilege integrations
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/26): add production operations
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/27): add enterprise governance
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/28): add lifecycle communication
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/29): add associate capstone
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/30): add developer capstone
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/31): add architect foundations capstone
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* feat(cert/32): add architect professional capstone
Adds the lesson, runnable lab, deterministic tests, practice, and inspectable artifacts for this certification topic.
* chore(cert): define curriculum contract
Documents certification lesson invariants and keeps the AI tutor wrapper while excluding generated site data.
* docs(cert): define program and verified sources
Adds the independent curriculum policy, onboarding, prerequisites, research notes, and dated source register.
* feat(cert/ccao-f): add associate route and practice
Maps the associate blueprint to an ordered route, diagnostic, and original full-length practice assessment.
* feat(cert/ccdv-f): add developer route and practice
Maps the developer blueprint to an ordered route, diagnostic, and original full-length practice assessment.
* feat(cert/ccar-f): add architect foundations route
Maps the architect foundations blueprint to an ordered route, diagnostic, and original full-length practice assessment.
* feat(cert/ccar-p): add architect professional route
Maps the architect professional blueprint to an ordered route, diagnostic, and original full-length practice assessment.
* feat(skill): add AI-native certification tutor
Teaches certification routes step by step in compatible agent harnesses and keeps learner state outside the book workflow.
* test(cert): enforce certification contracts
Audits lesson, assessment, reference, and answer-position invariants and runs all certification labs in CI.
* docs(readme): publish certification entry points
Adds the GitHub tutor and website entry points across the canonical README and synchronized translations.
* feat(glossary): expand the learning reference
Adds deeper original definitions, learning areas, source links, filters, and navigable term detail.
* feat(site): redesign the interactive roadmap
Keeps the canonical top-to-bottom dependency graph while adding branded focus, path guidance, and reliable navigation.
* feat(site): integrate interactive learning surfaces
Adds certification routes, lessons, assessments, progress, navigation, artifact rendering, narration fixes, and deploy routing.
* fix(i18n): shard translation CI by phase, commit README translations, limit picker to supported languages
The translate workflow ran one job per language, but a full 503-lesson language
run is ~27h on a CPU runner. Every job hit the 5.5h limit and was killed before
its publish step, so it banked nothing and the translations branch never got
created: it would retry and die forever.
CI sharding
- Matrix is now one job per (language, phase). The largest phase (19, 85
lessons) is ~4.5h, comfortably under the limit; most are 1-1.6h. max-parallel
raised to 20.
- Cache is per-(language, phase) (i18n/<lang>/.cache/<phase>.json) and each job
publishes only its own i18n/<lang>/phases/<phase>/ slice, so disjoint shards
merge without clobbering. translate_lessons.py gains --phase __root__ for the
README and a per-phase cache path.
README translations (committed to main, not CI)
- scripts/build_readme_i18n.py rebuilds i18n/<lang>/README.md by replacing only
the translated line-spans in a copy of the English README; the banner, badges,
584-row lesson table, and every link are preserved byte-for-byte (round-trip
identity asserted every run). Root-relative links are rewritten to resolve two
levels deep.
- scripts/readme_translations.py holds hand-authored translations (highest
quality for a landing page) for 12 languages: es, fr, pt, de, it, zh, ja, ko,
hi, ar, ru, tr. Unmapped blocks fall back to English.
- README language bar points at the committed files and lists all 12. i18n/
README.md is un-ignored; lesson artifacts stay ignored.
- CI guard: build_readme_i18n.py --check fails on drift; the counts bot
regenerates them when it syncs the English stats block.
Language picker
- build.js emits only source + ci:true languages into langs.js, so the site
switcher offers only languages the site can actually serve (English + the 5
ci languages) instead of all 40 registry entries. Cache-bust bumped.
Fixes the timed-out run in the translate workflow.
* feat(learning): AI-native learning flow, learn-first homepage, evidence-backed learner wall
The course gains a terminal-first learning experience driven by any coding
agent, and the homepage leads with it.
Learning skills (skills/ canonical, .claude/skills/ mirror for cloners)
- start-learning: one-time onboarding. Three-question interview, placement
quiz, writes LEARNING.md (mission, entry phase, 20-phase path, progress log,
review queue) that every later session reads and updates.
- learn: the tutor loop. Warm-up recall from the previous lesson's quiz, then
the next lesson taught interactively (problem, concept, build, use), then the
post-stage quiz, then progress recorded. Works cloned or entirely over
raw.githubusercontent.com; no setup required.
- course-guide: topic router over the README contents. A topic, question, or
bug in; the exact lessons plus the right next command out.
- find-your-level: 503-lesson count, agent-neutral question flow, raw-fetch
fallback for ROADMAP.md, hand-off to start-learning/learn.
- check-understanding: no-clone fallback fetching lesson docs from raw.
- npx skills add rohitg00/ai-engineering-from-scratch installs exactly these
five for any SKILL.md agent (verified against this tree: 5 found, no dupes,
none of the 388 lesson artifacts). CI guard: skills/ and .claude/skills/
must stay identical.
README
- "Start learning in 30 seconds" section up top; Getting Started reordered
with terminal learning as Option A; skills table covers all five; the
toolkit section no longer claims npx installs the 388 outputs (it never
did; they install via scripts/install_skills.py).
Homepage
- Masthead install card: the two-command flow with real agent marks and a
copy chip (icon, hover invert, press scale, copied state, clipboard
fallback). Colophon "cp" button upgraded to the same component and its
label-swap no longer destroys the icon.
- Cycling figure plate fills the masthead's empty right side and explains
the course: FIG_001 forward pass draws itself and runs signal pulses;
FIG_002 types out a /learn agent session with a blinking caret; FIG_003
learning curves with graph grid, area fill, on-curve milestone markers
(computed on the bezier), axis arrowheads, and a rider dot. Sequential
fade between plates so text can never double-expose; fixed per-tier
width/offset so the plate never clips at any viewport; reduced-motion
shows a static plate.
- Learner wall: seamless JS-filled marquee (clones halves until the loop
covers any viewport, constant scroll speed, no blank gaps) with real
marks for every name that has a redistributable SVG (simple-icons plus
official Wikimedia files in site/logos/); IIT Bombay and Windsor are
type-set because only fair-use logos exist. Anonymized pull quote from a
Google AI engineer beneath. Grayscale with dark-theme invert.
- Mobile: command wraps instead of horizontal scrolling.
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
English stays canonical. Translations generate to a separate translations
branch (never main); the site, README, and books all consume them. Default
engine is NLLB-200 in the CI runner: no API key, no Vercel cost.
One pipeline, three surfaces, none bloating main:
- lessons: 503 docs -> translations branch, fetched at runtime with English
fallback; English path byte-identical to before
- README: translated to the same branch, linked from the README header
- books: build_book.py --lang reads translated markdown and emits
aiefs-vol{n}-{slug}-<lang>.epub/.pdf release assets (English fallback)
- languages.json: 40-language registry (FLORES-200 + ci flag) driving the
script, the site switcher, and the CI matrix
- scripts/translate_lessons.py: prose-only walker keeps code/math/figures/
tables/HTML/bold/links/metadata out of the model (byte-lossless across all
503 lessons + README); per-language sha256 cache written per lesson so runs
resume and never redo unchanged English; providers pluggable (nllb default)
- .github/workflows/translate.yml + translate-requirements.txt: one job per
language, restores its cache, translates changed docs, pushes race-safe
- site switcher (40 languages, English fallback); build.js emits gitignored
site/langs.js from the registry
- docs/i18n.md: architecture, no-waste guarantee, cost, quality sample
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.
README.md hardcoded counts ("428 lessons", "373 skills, 99 prompts, and
6 agents", ...) drift every time the curriculum grows. catalog.json is
already filesystem-truth via build_catalog.py + the existing catalog-drift
CI gate, so pin the README counts to it.
The new script (stdlib only, 3.10+) declares a table of regex patterns
anchored to README context (badge URLs/alt text, hero blockquote, 'spine'
prose, toolkit section, sponsor section), each mapped to a totals.<field>
in catalog.json. Per-phase counts in the Contents table (12 lessons,
22 lessons, ...) are deliberately not matched.
CLI:
python3 scripts/check_readme_counts.py # exit 1 on drift
python3 scripts/check_readme_counts.py --json # machine-readable
python3 scripts/check_readme_counts.py --fix # rewrite in place
Wired in as a third job (readme-counts-drift) in
.github/workflows/curriculum.yml, runs after catalog-drift, strict by
default (no continue-on-error).
Ran --fix once to clear current drift:
- 428 -> 435 lessons in 5 locations (badge URL, badge alt, hero
blockquote, 'spine' prose, 'portfolio of N artifacts', sponsor
section)
- "6 agents" claim was fabricated: 0 outputs/agent-*.md files exist
on disk. The toolkit directory tree was edited to drop agents/ and
mcp-servers/ rows (folders exist but are empty), and the
"373 skills, 99 prompts, and 6 agents" prose now reads
"373 skills and 99 prompts".
Action SHAs pinned to actions/checkout@34e114876b
and actions/setup-python@a26af69be9,
persist-credentials: false on both.
Generates a lesson directory skeleton with code/, notebook/, docs/,
outputs/ and a docs/en.md prefilled from LESSON_TEMPLATE.md. Enforces
NN-kebab-case slug and rejects overwrites. Prints the exact ROADMAP.md
markdown-link row and atomic commit command so contributors cannot
accidentally skip either.