- Rename course/11-break-your-engine to 13-break-your-engine and update every
link and mention; start-module explains that Module 13 has no tests to start.
- tools/diff-tracks.mjs (npm run diff:tracks): stages both references of a
module, generates a seeded random SpellGrid level and script per seed, pipes
it to the Rust and TypeScript CLIs and diffs their output; crashes on one or
both sides fail. stagePlay takes a module number.
- register_assembled: the TypeScript track compared only the text of an
existing Assembled card, so a base re-registered with a new cost (or a
different split) silently rewrote the earlier card. It now compares every
field the engine reads, as Rust does (Modules 5-10).
New test_05_assemble_never_rewrites_an_earlier_card.
- SpellGrid CLIs: coordinates and chooser numbers are 1-9 plain digits in both
tracks (Rust accepted signs, TypeScript accepted "+2", "0x2", "1e0"); Rust
quotes card names verbatim instead of with Debug escapes; Rust joins the
minion list with "; " instead of rewriting ", ". Two new CLI tests per track.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- lessons 8 and 9 updated for the once-per-move rule, per-object negated
conversion and the new ordering tests
- tools/solve-spellgrid.mjs: breadth-first search over a SpellGrid level
with the TypeScript reference; --never-rule and --naive
- README, harness.md and the mentor skill know the new beat and module
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Lesson 10 and both M10 reference READMEs now give the real recipe
(node tools/play-spellgrid.mjs <rust|ts> [l1|l2|l3]); root script play:spellgrid.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- cardDirs: course/cards only from Module 5 (spec 6.2a); fixture modules 04/05 and tests
- coupling-audit: noun words match as UPPERCASE, PascalCase or a whole string literal;
lowercase identifiers like key/flag pass; card names keep every variant
- isMain() argv guard replaces import.meta.main in coupling-audit and verify-references;
engines.node >=22
- expansion-check: git diff --no-renames so moving engine code into content fails
- start-module and other tools: clear error when .course.json is missing
- check-links: malformed URLs reported as invalid URL instead of throwing
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Re-verify Teikari article quotes and GDC speaker, soften unsourced
claims (lessons 01, 06, 07, 10), add course-simplification bullets to
lesson 07's differs box, qualify OPEN obstruction wording in research,
and add tools/check-links.mjs (report-only) with npm run check:links.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pages (index, disclaimer, about), lockfile, root test:site script, fix for
Starlight 0.42 sidebar config and <details> rendering in generated MDX.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>