Files
systemic-game-design-course/course/07-rule-resolution/reference/rust
Lucas WintherandClaude Opus 5.5 638549161f
CI / Tool tests and sync-check (push) Successful in 13s
CI / Verify references (all modules, Rust and TS) (push) Successful in 1m32s
CI / Verify Expansion Drop solutions (all modules, Rust and TS) (push) Successful in 1m35s
CI / Coupling audit on references (push) Successful in 13s
CI / Site build (push) Successful in 25s
CI / Naive engine tests (Module 0) (push) Successful in 32s
feat(ci): verify Expansion Drop solutions; README quick start, disclaimer link; Rust reference lockfiles
- verify-references --expansion overlays expansion/solution on each reference and runs the
  cumulative tests plus the drop test; refuses a solution that touches src/engine/
- CI job verify-expansions
- README: workspace-template + git init step, tool list, repo disclaimer link
- Cargo.lock for every Rust reference (staged with the reference, pins serde for rustc 1.85.1)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 19:13:11 +01:00
..
2026-10-29 03:47:48 +01:00
2026-10-29 03:47:48 +01:00
2026-10-29 03:47:48 +01:00
2026-10-29 03:47:48 +01:00
2026-10-29 03:47:48 +01:00

Module 7 reference engine (Rust)

The course's own engine as of the end of Module 7. Part I's card engine is unchanged, and all of its tests still pass. The Part II engine in src/engine/puzzle/ now reads IS NOT and resolves the parsed rules into the rules in force. Module 6'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 of course/cards/ staged by tools/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 operators IS, AND, NOT, the meta-noun TEXT and the property PUSH of the base rule TEXT IS PUSH.
    • grid.rs: the level format, object kinds and the board. Module 7 adds Board::get.
    • word.rs: the lexicon and the lexer. Module 7 adds Selects: which objects a noun names as a subject (its own things by default, every text object for TEXT, or every non-text object), read from the word list's optional "selects" field, and Lexicon::names.
    • parse.rs: the parser. Module 7 adds NOT: before a complement it negates that complement (Rule::negated); before a subject it ends the run of subjects without that subject. Each rule also records its complement's role, so a conversion (X IS <noun>) can be told apart.
    • resolve.rs (new): the resolution pass. Negation first (X IS NOT Y cancels every X IS Y and stays in force), then the identity lock (a surviving X IS X cancels X IS Y for nouns Y).
    • level.rs: a level in play. Every change to the board parses, then resolves. has_property answers for one object from the rules in force.
    • mod.rs: the module's exports.
  • The rest of src/engine/: Part I, unchanged.
  • src/content/words.json: unchanged from Module 6.
  • src/harness.rs: the adapter the course tests call. Module 7 adds Baba::active_rules and Baba::has_property; rules() now lists negated rules too ("BABA IS NOT YOU").

Run it with the module's tests: node tools/verify-references.mjs 07 from the course repository.