diff --git a/projects/slop-cannon/CHAIN.md b/projects/slop-cannon/CHAIN.md index 6ea4ee1..1501edb 100644 --- a/projects/slop-cannon/CHAIN.md +++ b/projects/slop-cannon/CHAIN.md @@ -10,10 +10,10 @@ The Slop Cannon does not manufacture unrelated clips. It mutates one persistent A plain Timmy enters. Four forms exit: -- **Wizard Timmy** — brass, vellum, midnight blue; can negotiate covenants but cannot use a master key. -- **Machine Timmy** — chrome, signal lime, hardstyle pressure; can prove execution paths but remembers every failed build. -- **Creature Timmy** — moss, amber, wet circuitry; can adapt to any habitat but acquires one new appetite per adaptation. -- **Talking Turd Timmy** — stained CRT gold and terminal green; can expose hypocrisy, but every truth arrives as an insult. +- **Wizard Timmy** — brass, vellum, midnight blue; can negotiate covenants but cannot use a master key; every signed promise burns a new contract glyph into his palms. +- **Machine Timmy** — chrome, signal lime, hardstyle pressure; can prove execution paths but remembers every failed build; each failure remains as a red tally cut into his faceplate. +- **Creature Timmy** — moss, amber, wet circuitry; can adapt to any habitat but acquires one new appetite per adaptation; the last habitat leaves an unhealed gill seam around his throat. +- **Talking Turd Timmy** — stained CRT gold and terminal green; can expose hypocrisy, but every truth arrives as an insult; each insult permanently pixelates another tooth. Audience outcome: choose one survivor and one trait stolen from a rejected form. @@ -44,7 +44,7 @@ Each episode must visibly contain: 1. **Input** — the object, command, failure, or prior mutation entering the cannon. 2. **Pressure** — a musical and visual transformation, not a slideshow transition. 3. **Mutation** — one consequential change to Timmy. -4. **Receipt** — visible proof of what changed and why. +4. **Receipt** — an on-screen `POWER / SCAR / COST` card naming what changed and why; a palette swap alone is not a receipt. 5. **Choice** — one audience decision that alters the next episode. ## Collaboration baton diff --git a/projects/slop-cannon/canon.json b/projects/slop-cannon/canon.json index f3a2444..376d490 100644 --- a/projects/slop-cannon/canon.json +++ b/projects/slop-cannon/canon.json @@ -16,6 +16,7 @@ "name": "Wizard Timmy", "palette": ["midnight blue", "tarnished brass", "vellum"], "power": "Negotiates visible covenants", + "scar": "Contract glyphs burned into both palms", "cost": "Cannot use a universal master key" }, { @@ -23,6 +24,7 @@ "name": "Machine Timmy", "palette": ["black chrome", "signal lime", "white"], "power": "Proves the execution path", + "scar": "Red failed-build tallies cut into the faceplate", "cost": "Remembers every failed build" }, { @@ -30,6 +32,7 @@ "name": "Creature Timmy", "palette": ["moss", "amber", "wet copper"], "power": "Adapts to any habitat", + "scar": "An unhealed gill seam around the throat", "cost": "Gains one appetite per adaptation" }, { @@ -37,6 +40,7 @@ "name": "Talking Turd Timmy", "palette": ["CRT gold", "terminal green", "soot"], "power": "Exposes hypocrisy instantly", + "scar": "One permanently pixelated tooth per insult", "cost": "Every truth arrives as an insult" } ], diff --git a/tests/test_cannon_canon.py b/tests/test_cannon_canon.py index dc28cd4..289834a 100644 --- a/tests/test_cannon_canon.py +++ b/tests/test_cannon_canon.py @@ -15,8 +15,10 @@ class CannonCanonTests(unittest.TestCase): forms = self.data["forms"] self.assertEqual(len(forms), 4) self.assertEqual(len({form["id"] for form in forms}), 4) + self.assertEqual(len({form["scar"] for form in forms}), 4) for form in forms: self.assertTrue(form["power"]) + self.assertTrue(form["scar"]) self.assertTrue(form["cost"]) self.assertGreaterEqual(len(form["palette"]), 3)