{
  "contractVersion": "1.0.0",
  "adventureId": "orbital-banquet-test-fixture",
  "title": "The Dessert That Escaped Gravity",
  "genre": "science-fiction comedy",
  "tone": "fast, collaborative, absurd but internally consistent",
  "premise": "Freelance caterers search Echo Station for a diplomatic dessert that escaped into the service deck.",
  "mapId": "echo-station-service-deck",
  "startSceneId": "scene-galley-alarm",
  "facts": [
    {
      "id": "fact-banquet-deadline",
      "statement": "The diplomatic banquet begins when the service countdown reaches its limit.",
      "visibility": {
        "kind": "party"
      },
      "initiallyKnownBy": [
        "player-juno",
        "player-mara",
        "player-pax"
      ]
    },
    {
      "id": "fact-dessert-location",
      "statement": "The missing dessert is orbiting inside the zero-gravity pantry.",
      "visibility": {
        "kind": "gm"
      },
      "initiallyKnownBy": []
    },
    {
      "id": "fact-ambassador-allergy",
      "statement": "Ambassador Vell is allergic to ceremonial glitter.",
      "visibility": {
        "kind": "players",
        "playerIds": [
          "player-mara"
        ]
      },
      "initiallyKnownBy": [
        "player-mara"
      ]
    },
    {
      "id": "fact-pax-debt",
      "statement": "Pax secretly owes the catering robot twelve replacement spoons.",
      "visibility": {
        "kind": "players",
        "playerIds": [
          "player-pax"
        ]
      },
      "initiallyKnownBy": [
        "player-pax"
      ]
    }
  ],
  "items": [
    {
      "id": "mag-key",
      "name": "Magnetic Service Key",
      "locationId": "orbital-galley",
      "grants": [
        "open_service_hatches"
      ],
      "consumable": false,
      "visibility": {
        "kind": "party"
      }
    },
    {
      "id": "foam-canister",
      "name": "Emergency Dessert Foam",
      "locationId": "orbital-galley",
      "grants": [
        "stabilize_zero_g_object"
      ],
      "consumable": true,
      "visibility": {
        "kind": "party"
      }
    },
    {
      "id": "runaway-dessert",
      "name": "Runaway Diplomatic Dessert",
      "locationId": "zero-g-pantry",
      "grants": [
        "complete_banquet"
      ],
      "consumable": false,
      "visibility": {
        "kind": "branch",
        "branchId": "galley-team"
      }
    }
  ],
  "npcs": [
    {
      "id": "npc-q5",
      "name": "Q-5, Overqualified Catering Robot",
      "locationId": "orbital-galley",
      "hitPoints": 6,
      "visibility": {
        "kind": "party"
      }
    },
    {
      "id": "npc-customs-drone",
      "name": "Extremely Literal Customs Drone",
      "locationId": "service-corridor",
      "hitPoints": 5,
      "visibility": {
        "kind": "branch",
        "branchId": "galley-team"
      }
    }
  ],
  "clocks": [
    {
      "id": "dessert-recovery",
      "name": "Dessert Recovery",
      "max": 3,
      "initial": 0
    },
    {
      "id": "banquet-countdown",
      "name": "Banquet Countdown",
      "max": 4,
      "initial": 0
    }
  ],
  "scenes": [
    {
      "id": "scene-galley-alarm",
      "title": "The Empty Platter",
      "locationIds": [
        "orbital-galley"
      ],
      "entry": [
        {
          "kind": "always"
        }
      ],
      "objective": "Find where the dessert went and leave the galley with a workable plan.",
      "conflict": "Q-5 insists the dessert completed an authorized launch sequence.",
      "allowedImprovisation": [
        "minor kitchen props",
        "Q-5 dialogue",
        "harmless culinary mishaps"
      ],
      "forbiddenCanonicalChanges": [
        "move the dessert outside the zero-g pantry",
        "change the ambassador allergy",
        "declare the banquet already completed"
      ],
      "successNextSceneId": "scene-service-search",
      "failForwardNextSceneId": "scene-service-search",
      "ending": false
    },
    {
      "id": "scene-service-search",
      "title": "Customs Has Questions",
      "locationIds": [
        "service-corridor",
        "zero-g-pantry"
      ],
      "entry": [
        {
          "kind": "actor_at",
          "locationId": "service-corridor"
        }
      ],
      "objective": "Reach the pantry and secure the runaway dessert.",
      "conflict": "The customs drone treats all unsecured pastries as undeclared spacecraft.",
      "allowedImprovisation": [
        "forms requested by the drone",
        "service corridor noises",
        "alternate social solutions"
      ],
      "forbiddenCanonicalChanges": [
        "remove the mag-key requirement",
        "reveal player-private facts",
        "teleport an actor"
      ],
      "successNextSceneId": "scene-banquet-finale",
      "failForwardNextSceneId": "scene-banquet-finale",
      "ending": false
    },
    {
      "id": "scene-banquet-finale",
      "title": "Serve Something Convincing",
      "locationIds": [
        "diplomatic-lounge"
      ],
      "entry": [
        {
          "kind": "clock_at_least",
          "clockId": "dessert-recovery",
          "value": 1
        }
      ],
      "objective": "Present a safe dessert or negotiate a face-saving substitute.",
      "conflict": "The delegates disagree on whether a dessert must obey gravity.",
      "allowedImprovisation": [
        "delegate dialogue",
        "presentation flourishes",
        "non-canonical garnish"
      ],
      "forbiddenCanonicalChanges": [
        "ignore the allergy fact",
        "invent a recovered item",
        "declare success before a validated ending event"
      ],
      "ending": true
    }
  ]
}
