Require visible scars in Cannon receipts

This commit is contained in:
Timmy Jr. 2026-08-07 17:05:09 +00:00
parent 560042abcb
commit 47ca557c27
3 changed files with 11 additions and 5 deletions

View File

@ -10,10 +10,10 @@ The Slop Cannon does not manufacture unrelated clips. It mutates one persistent
A plain Timmy enters. Four forms exit: A plain Timmy enters. Four forms exit:
- **Wizard Timmy** — brass, vellum, midnight blue; can negotiate covenants but cannot use a master key. - **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. - **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. - **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. - **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. 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. 1. **Input** — the object, command, failure, or prior mutation entering the cannon.
2. **Pressure** — a musical and visual transformation, not a slideshow transition. 2. **Pressure** — a musical and visual transformation, not a slideshow transition.
3. **Mutation** — one consequential change to Timmy. 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. 5. **Choice** — one audience decision that alters the next episode.
## Collaboration baton ## Collaboration baton

View File

@ -16,6 +16,7 @@
"name": "Wizard Timmy", "name": "Wizard Timmy",
"palette": ["midnight blue", "tarnished brass", "vellum"], "palette": ["midnight blue", "tarnished brass", "vellum"],
"power": "Negotiates visible covenants", "power": "Negotiates visible covenants",
"scar": "Contract glyphs burned into both palms",
"cost": "Cannot use a universal master key" "cost": "Cannot use a universal master key"
}, },
{ {
@ -23,6 +24,7 @@
"name": "Machine Timmy", "name": "Machine Timmy",
"palette": ["black chrome", "signal lime", "white"], "palette": ["black chrome", "signal lime", "white"],
"power": "Proves the execution path", "power": "Proves the execution path",
"scar": "Red failed-build tallies cut into the faceplate",
"cost": "Remembers every failed build" "cost": "Remembers every failed build"
}, },
{ {
@ -30,6 +32,7 @@
"name": "Creature Timmy", "name": "Creature Timmy",
"palette": ["moss", "amber", "wet copper"], "palette": ["moss", "amber", "wet copper"],
"power": "Adapts to any habitat", "power": "Adapts to any habitat",
"scar": "An unhealed gill seam around the throat",
"cost": "Gains one appetite per adaptation" "cost": "Gains one appetite per adaptation"
}, },
{ {
@ -37,6 +40,7 @@
"name": "Talking Turd Timmy", "name": "Talking Turd Timmy",
"palette": ["CRT gold", "terminal green", "soot"], "palette": ["CRT gold", "terminal green", "soot"],
"power": "Exposes hypocrisy instantly", "power": "Exposes hypocrisy instantly",
"scar": "One permanently pixelated tooth per insult",
"cost": "Every truth arrives as an insult" "cost": "Every truth arrives as an insult"
} }
], ],

View File

@ -15,8 +15,10 @@ class CannonCanonTests(unittest.TestCase):
forms = self.data["forms"] forms = self.data["forms"]
self.assertEqual(len(forms), 4) self.assertEqual(len(forms), 4)
self.assertEqual(len({form["id"] for form in 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: for form in forms:
self.assertTrue(form["power"]) self.assertTrue(form["power"])
self.assertTrue(form["scar"])
self.assertTrue(form["cost"]) self.assertTrue(form["cost"])
self.assertGreaterEqual(len(form["palette"]), 3) self.assertGreaterEqual(len(form["palette"]), 3)