A Deathrattle summon used the dying minion's board index from before the Death Creation Step removed anything. That index is stale when a minion to its left dies in the same step, so the token landed one place too far right. Each Death Event now records `before`: the nearest minion to the right that is not dying in the same step. The position handed to the effect context is resolved when the trigger resolves: the current index of `before`, or the right end. Applied to the Rust and TS references of Modules 3-10. Module 3 gains two tests, documented in scenarios.md: test_03_summon_position_after_simultaneous_deaths (fails before the fix) and test_03_simultaneous_summons_keep_board_order. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Module 8 reference engine (Rust)
The course's own engine as of the end of Module 8. Part I's card engine is unchanged, and all of its tests still pass. The Part II engine in src/engine/puzzle/ now moves objects: each YOU object's move is planned in full, push chain and all, and only then committed. Module 7's reference was the starting point, so a diff between the two shows what this module adds.
cards/(at the crate root; not in this directory): Part I's card data, a copy ofcourse/cards/staged bytools/verify-references.mjs. Part II doesn't read it.src/engine/puzzle/: the Part II engine. It names no noun: the engine's own words are the operatorsIS,AND,NOT, the meta-nounTEXT, the propertyPUSHof the base ruleTEXT IS PUSH, and from Module 8 the propertyYOU, which picks the objects that move.grid.rs: the level format, object kinds and the board. Module 8 addsBoard::find,Board::remove,Board::shift,Board::atandDisplayforKind(the kind as placed, forkinds_at).movement.rs(new): validate, then commit.Planner(try_move,staying_at,destroy,has),Step,Plan,ResponseandDir. The planner reads the board and plans one step at a time; for each step it runs content's movement responses in order, and rolls back everything a step added if a response blocks it. The edge of the level blocks every step.level.rs: a level in play. Module 8 addsLevel::move_you: theYOUobjects move one at a time, furthest ahead first, each planned and then committed; the rules are reparsed once at the end.has_propertyisfalsefor a destroyed object.word.rs,parse.rs,resolve.rs: unchanged.mod.rs: the module's exports.
- The rest of
src/engine/: Part I, unchanged. src/content/movement.rs(new) andsrc/content/mod.rs: the movement responses, in the order the engine runs them:OPEN/SHUT,PUSH,STOP. What a property does when something moves is content, not engine.src/content/words.json: Module 8 addsOPENandSHUT.src/harness.rs: the adapter the course tests call. Module 8 addsBaba::move_dir,Baba::pos_of,Baba::kinds_at, and re-exportsDir.
Run it with the module's tests: node tools/verify-references.mjs 08 from the course repository.