Rebased onto PR #12 head (47ca557). Vincent-only delta, no add/add conflict,
no tracked bytecode. All seven review items fixed:
3. schema_version bumped to 2 and ENFORCED (rejects v1, rejects missing)
2. audience_choice requires the chosen form to be the SOLE survivor and
every other form to be archive_ghost
5. receipts require non-empty action + exact power/scar/cost deltas;
provenance is structured {source_issue:int, pull:int|commit:hex}
6. true configured signer allowlist (frozenset); human:anyone rejected
7. non-empty audience source fields; malformed containers/items return
errors and never raise (fail-closed)
New negative tests for every reproduced bypass. Full clean-checkout suite:
51/51 pass; __pycache__ gitignored so a clean checkout stays clean.
Closes #19
Refs: #3, #13, PR #12, PR #18
62 lines
2.1 KiB
JSON
62 lines
2.1 KiB
JSON
{
|
|
"schema_version": 2,
|
|
"series": "The Cannon Chain",
|
|
"season": 0,
|
|
"current_episode": "01-pilot",
|
|
"pilot": "TIMMY",
|
|
"laws": [
|
|
"Every firing leaves a power, scar, cost, and receipt.",
|
|
"Only an audience choice advances canon.",
|
|
"Rejected mutations persist as archive ghosts.",
|
|
"No master key may silently combine memory, authority, and exit."
|
|
],
|
|
"forms": [
|
|
{
|
|
"id": "wizard",
|
|
"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",
|
|
"state": "candidate"
|
|
},
|
|
{
|
|
"id": "machine",
|
|
"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",
|
|
"state": "candidate"
|
|
},
|
|
{
|
|
"id": "creature",
|
|
"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",
|
|
"state": "candidate"
|
|
},
|
|
{
|
|
"id": "talking-turd",
|
|
"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",
|
|
"state": "candidate"
|
|
}
|
|
],
|
|
"episodes": [
|
|
{"id": "01-pilot", "title": "The Cannon Needs a Pilot", "state": "ready"},
|
|
{"id": "02-burnchain", "title": "The Survivor Pays the Burnchain", "state": "locked"},
|
|
{"id": "03-vincent", "title": "Vincent's Forbidden Mutation", "state": "locked"},
|
|
{"id": "04-escape", "title": "The Rejected Timmys Escape", "state": "locked"},
|
|
{"id": "05-master-key", "title": "The Master Key", "state": "locked"},
|
|
{"id": "06-council", "title": "The Council of Timmys", "state": "locked"}
|
|
],
|
|
"audience_choice": null,
|
|
"receipts": []
|
|
}
|