fix: module 10 review round 1 (module-local SpellGrid cards, cast target check, CLI without panic hook)

- SpellGrid cards move to course/10-spellgrid/cards; start-module and
  verify-references stage course/cards plus module-local cards up to the module,
  so M5-M9 workspaces get exactly the pre-M10 card set.
- cast() rejects a chosen-target spell without a target (checkCast/checkPlay);
  new test_10_targeted_spell_needs_target.
- Rust CLI pre-validates instead of swapping the global panic hook.
- Catalog: CRIER noun; DEATHRATTLE/BATTLECRY note on lexicon vs catalog role.
- Lesson: design note on mid-movement reparse.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas WintherandClaude Opus 5.5 committed 2026-10-29 05:11:09 +01:00
1 parent a0cf9be214
commit 6f576940b7
34 files changed
+295 -79

No files matched your search

-11
View File
@@ -1,11 +0,0 @@
{
"name": "Bramble Wall",
"type": "minion",
"cost": 1,
"attack": 0,
"health": 3,
"noun": "BRAMBLE",
"split": 0,
"text": [],
"game": "spellgrid"
}
-28
View File
@@ -1,28 +0,0 @@
{
"name": "Ember Moth",
"type": "minion",
"cost": 1,
"attack": 1,
"health": 1,
"noun": "MOTH",
"split": 1,
"text": [
{
"kind": "keyword",
"keyword": "Taunt"
},
{
"kind": "trigger",
"on": "deathrattle"
},
{
"kind": "effect",
"effect": {
"type": "dealDamage",
"target": "enemyHero",
"amount": 2
}
}
],
"game": "spellgrid"
}
-18
View File
@@ -1,18 +0,0 @@
{
"name": "Graft",
"type": "spell",
"cost": 2,
"split": 0,
"text": [
{
"kind": "effect",
"effect": {
"type": "assemble",
"filter": {
"trigger": "deathrattle"
}
}
}
],
"game": "spellgrid"
}
-21
View File
@@ -1,21 +0,0 @@
{
"name": "Grave Warden",
"type": "minion",
"cost": 3,
"attack": 1,
"health": 1,
"noun": "WARDEN",
"split": 0,
"text": [
{
"kind": "aura",
"modifier": {
"type": "triggerMultiplier",
"trigger": "deathrattle",
"times": 2,
"stacking": "max"
}
}
],
"game": "spellgrid"
}
-24
View File
@@ -1,24 +0,0 @@
{
"name": "Powder Keg",
"type": "minion",
"cost": 2,
"attack": 1,
"health": 1,
"noun": "KEG",
"split": 0,
"text": [
{
"kind": "trigger",
"on": "deathrattle"
},
{
"kind": "effect",
"effect": {
"type": "dealDamage",
"target": "allMinions",
"amount": 1
}
}
],
"game": "spellgrid"
}
-24
View File
@@ -1,24 +0,0 @@
{
"name": "Rune Scribe",
"type": "minion",
"cost": 2,
"attack": 1,
"health": 1,
"noun": "SCRIBE",
"split": 0,
"text": [
{
"kind": "trigger",
"on": "deathrattle"
},
{
"kind": "effect",
"effect": {
"type": "spawnText",
"word": "WIN",
"at": "self"
}
}
],
"game": "spellgrid"
}
-17
View File
@@ -1,17 +0,0 @@
{
"name": "Spark",
"type": "spell",
"cost": 1,
"split": 0,
"text": [
{
"kind": "effect",
"effect": {
"type": "dealDamage",
"target": "chosen",
"amount": 1
}
}
],
"game": "spellgrid"
}
-11
View File
@@ -1,11 +0,0 @@
{
"name": "Thorn Hedge",
"type": "minion",
"cost": 1,
"attack": 0,
"health": 2,
"noun": "HEDGE",
"split": 0,
"text": [],
"game": "spellgrid"
}
-11
View File
@@ -1,11 +0,0 @@
{
"name": "Tin Knight",
"type": "minion",
"cost": 2,
"attack": 1,
"health": 3,
"noun": "KNIGHT",
"split": 0,
"text": [],
"game": "spellgrid"
}
-24
View File
@@ -1,24 +0,0 @@
{
"name": "Town Crier",
"type": "minion",
"cost": 1,
"attack": 1,
"health": 1,
"noun": "CRIER",
"split": 0,
"text": [
{
"kind": "trigger",
"on": "battlecry"
},
{
"kind": "effect",
"effect": {
"type": "dealDamage",
"target": "enemyHero",
"amount": 1
}
}
],
"game": "spellgrid"
}