Fire Curtain / Egress Interlock Review

The review resolves a live command collision. It does not open from seven starter cards or from the old empty-house drop record alone.

Pressure intake

rite_id: storyteller.rite.fire_curtain_interlock_intake.v1
choice: 0
option_id: record_dual_safety_conflict
repeatable: false
slots:
  drop_trace: storyteller.card.fire_curtain_drop_test_trace.v1
  aisle_census: storyteller.card.fire_curtain_occupied_aisle_census.v1
  stop_order: storyteller.card.usher_lin_stop_order.v1
  sponsor_cue: storyteller.card.fire_curtain_sponsor_safehouse_cue.v1
records:
  - fire_curtain_interlock.intake_recorded
  - fire_curtain_interlock.pressure.drop_test_passed
  - fire_curtain_interlock.pressure.aisle_occupied
  - fire_curtain_interlock.pressure.usher_stop_order_visible
  - fire_curtain_interlock.pressure.sponsor_claimed_route_clearance

The intake records four simultaneous pressures. It does not choose whether F2 drops or aisle B stays open.

Collision prerequisite

The intake must be followed by storyteller.event.fire_curtain_egress_collision.v1, option 0 open_interlock_hearing. The event must set the exact review flags and state:

  • fire_curtain_interlock.collision_opened;
  • fire_curtain_interlock.drop_authority_visible;
  • fire_curtain_interlock.egress_authority_visible;
  • fire_curtain_interlock.usher_claim_pending;
  • fire_curtain_interlock.sponsor_broadcast_claim_pending;
  • fire_curtain_interlock.state.contested_interlock.

Exact review assignment

review_id: storyteller.rite.fire_curtain_egress_interlock_review.v1
repeatable: false
slots:
  docket: storyteller.card.fire_curtain_interlock_docket.v1
  drop_trace: storyteller.card.fire_curtain_drop_test_trace.v1
  aisle_census: storyteller.card.fire_curtain_occupied_aisle_census.v1
  control_chain: storyteller.card.fire_curtain_control_chain_receipt.v1
  stop_order: storyteller.card.usher_lin_stop_order.v1
  sponsor_cue: storyteller.card.fire_curtain_sponsor_safehouse_cue.v1
  future_route: storyteller.card.fire_curtain_future_route_interlock.v1

Ordered branch contract

branches:
  - choice: 0
    id: certify_drop_not_egress
    interlock_state_after: drop_test_only
    future_effect: separate_egress_clearance_required
    counter_deltas: { fireCurtainDropEvidence: 3, egressClearanceDebt: 2, usherProtection: 1, sponsorPressure: 1 }
  - choice: 1
    id: clear_aisle_then_repeat_drop
    interlock_state_after: aisle_cleared_retest_due
    future_effect: repeat_drop_witness_required
    counter_deltas: { aisleClearanceIntegrity: 3, retestDuty: 2, showDelay: 2, sponsorPressure: 1 }
  - choice: 2
    id: hold_last_person_window
    interlock_state_after: last_person_window_held
    future_effect: manual_hold_witness_required
    counter_deltas: { lastPersonProtection: 3, manualHoldWitnessDuty: 2, curtainDelay: 2, crowdFriction: 1 }
  - choice: 3
    id: split_floor_and_broadcast_cues
    interlock_state_after: floor_broadcast_split
    future_effect: broadcast_cue_cannot_drive_egress
    counter_deltas: { authoritySeparation: 3, broadcastCueRestraint: 2, floorControlVisibility: 2, sponsorPressure: 2 }
  - choice: 4
    id: honor_usher_lin_stop_order
    interlock_state_after: usher_veto_honored
    future_effect: usher_lin_signoff_required
    counter_deltas: { usherProtection: 3, stopOrderIntegrity: 3, floorDelay: 1, sponsorPressure: 2 }
  - choice: 5
    id: quarantine_safehouse_cue
    interlock_state_after: sponsor_cue_quarantined
    future_effect: interlock_witness_pair_required
    counter_deltas: { sponsorCueQuarantine: 3, witnessPairDuty: 2, routeRewriteCost: 2, broadcastFriction: 1 }
  - choice: 6
    id: air_synchronized_safety_claim
    interlock_state_after: false_synchronized_clearance
    future_effect: false_interlock_default_pending
    counter_deltas: { falseSynchronizedClearance: 3, harmedAudienceExposure: 2, sponsorSafehouseSpeed: 2, interlockIntegrity: -3 }

Every branch sets only its own branch flag, interlock state, future-route effect, and four declared counters. Only zero-based choice 6 may set broadcast_reality.fire_curtain_synchronized_safety_claim_aired and the exact default pending triple.

Reachability and missability

All seven branches must resolve from the same exact post-collision packet. A focused test must reject a missing intake flag, missing collision flag, wrong card ID, assigned card absent from hand, omitted choice, or second review resolution. Because the review is nonrepeatable, selecting one command order makes the other six missable for this incident.

Prohibited substitutions

The review rejects an old safety-curtain tag, a mezzanine fire-door wedge, a generic safety certificate, a dashboard state, or a raw curtain count. It cannot turn a successful empty-house drop into evacuation clearance, sponsor safehouse authority, consent, archive ownership, or clean public truth.